2010-09-20 22:08:53 +02:00
|
|
|
<!-- doc/src/sgml/pgstatstatements.sgml -->
|
2009-01-04 23:19:59 +01:00
|
|
|
|
2011-05-08 04:29:20 +02:00
|
|
|
<sect1 id="pgstatstatements" xreflabel="pg_stat_statements">
|
2009-01-04 23:19:59 +01:00
|
|
|
<title>pg_stat_statements</title>
|
|
|
|
|
|
|
|
<indexterm zone="pgstatstatements">
|
|
|
|
<primary>pg_stat_statements</primary>
|
|
|
|
</indexterm>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
The <filename>pg_stat_statements</filename> module provides a means for
|
|
|
|
tracking execution statistics of all SQL statements executed by a server.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
The module must be loaded by adding <literal>pg_stat_statements</> to
|
|
|
|
<xref linkend="guc-shared-preload-libraries"> in
|
|
|
|
<filename>postgresql.conf</>, because it requires additional shared memory.
|
|
|
|
This means that a server restart is needed to add or remove the module.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<sect2>
|
2011-01-29 19:00:18 +01:00
|
|
|
<title>The <structname>pg_stat_statements</structname> View</title>
|
2009-01-04 23:19:59 +01:00
|
|
|
|
|
|
|
<para>
|
|
|
|
The statistics gathered by the module are made available via a system view
|
|
|
|
named <structname>pg_stat_statements</>. This view contains one row for
|
|
|
|
each distinct query text, database ID, and user ID (up to the maximum
|
|
|
|
number of distinct statements that the module can track). The columns
|
2009-05-18 13:08:24 +02:00
|
|
|
of the view are shown in <xref linkend="pgstatstatements-columns">.
|
2009-01-04 23:19:59 +01:00
|
|
|
</para>
|
|
|
|
|
2009-05-18 13:08:24 +02:00
|
|
|
<table id="pgstatstatements-columns">
|
2011-01-29 19:00:18 +01:00
|
|
|
<title><structname>pg_stat_statements</> Columns</title>
|
2009-01-04 23:19:59 +01:00
|
|
|
|
|
|
|
<tgroup cols="4">
|
|
|
|
<thead>
|
|
|
|
<row>
|
|
|
|
<entry>Name</entry>
|
|
|
|
<entry>Type</entry>
|
|
|
|
<entry>References</entry>
|
|
|
|
<entry>Description</entry>
|
|
|
|
</row>
|
|
|
|
</thead>
|
|
|
|
<tbody>
|
|
|
|
<row>
|
|
|
|
<entry><structfield>userid</structfield></entry>
|
|
|
|
<entry><type>oid</type></entry>
|
|
|
|
<entry><literal><link linkend="catalog-pg-authid"><structname>pg_authid</structname></link>.oid</literal></entry>
|
|
|
|
<entry>OID of user who executed the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>dbid</structfield></entry>
|
|
|
|
<entry><type>oid</type></entry>
|
|
|
|
<entry><literal><link linkend="catalog-pg-database"><structname>pg_database</structname></link>.oid</literal></entry>
|
|
|
|
<entry>OID of database in which the statement was executed</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>query</structfield></entry>
|
|
|
|
<entry><type>text</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Text of the statement (up to <xref linkend="guc-track-activity-query-size"> bytes)</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>calls</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Number of times executed</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>total_time</structfield></entry>
|
|
|
|
<entry><type>double precision</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total time spent in the statement, in seconds</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>rows</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of rows retrieved or affected by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
2010-01-08 01:38:20 +01:00
|
|
|
<row>
|
|
|
|
<entry><structfield>shared_blks_hit</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of shared blocks hits by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>shared_blks_read</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of shared blocks reads by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>shared_blks_written</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of shared blocks writes by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>local_blks_hit</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of local blocks hits by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>local_blks_read</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of local blocks reads by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>local_blks_written</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of local blocks writes by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>temp_blks_read</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of temp blocks reads by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
|
|
|
<row>
|
|
|
|
<entry><structfield>temp_blks_written</structfield></entry>
|
|
|
|
<entry><type>bigint</type></entry>
|
|
|
|
<entry></entry>
|
|
|
|
<entry>Total number of temp blocks writes by the statement</entry>
|
|
|
|
</row>
|
|
|
|
|
2009-01-04 23:19:59 +01:00
|
|
|
</tbody>
|
|
|
|
</tgroup>
|
|
|
|
</table>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
This view, and the function <function>pg_stat_statements_reset</>,
|
|
|
|
are available only in databases they have been specifically installed into
|
2011-02-14 07:10:44 +01:00
|
|
|
by installing the <literal>pg_stat_statements</> extension.
|
2009-01-04 23:19:59 +01:00
|
|
|
However, statistics are tracked across all databases of the server
|
|
|
|
whenever the <filename>pg_stat_statements</filename> module is loaded
|
|
|
|
into the server, regardless of presence of the view.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
For security reasons, non-superusers are not allowed to see the text of
|
|
|
|
queries executed by other users. They can see the statistics, however,
|
|
|
|
if the view has been installed in their database.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Note that statements are considered the same if they have the same text,
|
|
|
|
regardless of the values of any out-of-line parameters used in the
|
|
|
|
statement. Using out-of-line parameters will help to group statements
|
|
|
|
together and may make the statistics more useful.
|
|
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2>
|
|
|
|
<title>Functions</title>
|
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
|
|
<term>
|
|
|
|
<function>pg_stat_statements_reset() returns void</function>
|
|
|
|
</term>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
<function>pg_stat_statements_reset</function> discards all statistics
|
|
|
|
gathered so far by <filename>pg_stat_statements</>.
|
|
|
|
By default, this function can only be executed by superusers.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
</variablelist>
|
|
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2>
|
2011-01-29 19:00:18 +01:00
|
|
|
<title>Configuration Parameters</title>
|
2009-01-04 23:19:59 +01:00
|
|
|
|
|
|
|
<variablelist>
|
|
|
|
<varlistentry>
|
|
|
|
<term>
|
|
|
|
<varname>pg_stat_statements.max</varname> (<type>integer</type>)
|
|
|
|
</term>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
<varname>pg_stat_statements.max</varname> is the maximum number of
|
|
|
|
statements tracked by the module (i.e., the maximum number of rows
|
|
|
|
in the <structname>pg_stat_statements</> view). If more distinct
|
|
|
|
statements than that are observed, information about the least-executed
|
|
|
|
statements is discarded.
|
|
|
|
The default value is 1000.
|
|
|
|
This parameter can only be set at server start.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
|
|
|
|
<varlistentry>
|
|
|
|
<term>
|
|
|
|
<varname>pg_stat_statements.track</varname> (<type>enum</type>)
|
|
|
|
</term>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
<varname>pg_stat_statements.track</varname> controls which statements
|
|
|
|
are counted by the module.
|
|
|
|
Specify <literal>top</> to track top-level statements (those issued
|
|
|
|
directly by clients), <literal>all</> to also track nested statements
|
|
|
|
(such as statements invoked within functions), or <literal>none</> to
|
|
|
|
disable.
|
|
|
|
The default value is <literal>top</>.
|
|
|
|
Only superusers can change this setting.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
|
2009-12-15 21:04:49 +01:00
|
|
|
<varlistentry>
|
|
|
|
<term>
|
|
|
|
<varname>pg_stat_statements.track_utility</varname> (<type>boolean</type>)
|
|
|
|
</term>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
<varname>pg_stat_statements.track_utility</varname> controls whether
|
|
|
|
utility commands are tracked by the module. Utility commands are
|
|
|
|
all those other than <command>SELECT</>, <command>INSERT</>,
|
|
|
|
<command>UPDATE</> and <command>DELETE</>.
|
|
|
|
The default value is <literal>on</>.
|
|
|
|
Only superusers can change this setting.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
|
2009-01-04 23:19:59 +01:00
|
|
|
<varlistentry>
|
|
|
|
<term>
|
|
|
|
<varname>pg_stat_statements.save</varname> (<type>boolean</type>)
|
|
|
|
</term>
|
|
|
|
|
|
|
|
<listitem>
|
|
|
|
<para>
|
|
|
|
<varname>pg_stat_statements.save</varname> specifies whether to
|
|
|
|
save statement statistics across server shutdowns.
|
|
|
|
If it is <literal>off</> then statistics are not saved at
|
|
|
|
shutdown nor reloaded at server start.
|
|
|
|
The default value is <literal>on</>.
|
|
|
|
This parameter can only be set in the <filename>postgresql.conf</>
|
|
|
|
file or on the server command line.
|
|
|
|
</para>
|
|
|
|
</listitem>
|
|
|
|
</varlistentry>
|
|
|
|
</variablelist>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
The module requires additional shared memory amounting to about
|
|
|
|
<varname>pg_stat_statements.max</varname> <literal>*</>
|
|
|
|
<xref linkend="guc-track-activity-query-size"> bytes. Note that this
|
|
|
|
memory is consumed whenever the module is loaded, even if
|
|
|
|
<varname>pg_stat_statements.track</> is set to <literal>none</>.
|
|
|
|
</para>
|
|
|
|
|
|
|
|
<para>
|
2011-10-04 18:36:18 +02:00
|
|
|
These parameters must be set in <filename>postgresql.conf</>.
|
|
|
|
Typical usage might be:
|
2009-01-04 23:19:59 +01:00
|
|
|
|
2010-07-29 21:34:41 +02:00
|
|
|
<programlisting>
|
2009-01-04 23:19:59 +01:00
|
|
|
# postgresql.conf
|
|
|
|
shared_preload_libraries = 'pg_stat_statements'
|
|
|
|
|
|
|
|
pg_stat_statements.max = 10000
|
|
|
|
pg_stat_statements.track = all
|
2010-07-29 21:34:41 +02:00
|
|
|
</programlisting>
|
|
|
|
</para>
|
2009-01-04 23:19:59 +01:00
|
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2>
|
2011-01-29 19:00:18 +01:00
|
|
|
<title>Sample Output</title>
|
2009-01-04 23:19:59 +01:00
|
|
|
|
2010-07-29 21:34:41 +02:00
|
|
|
<screen>
|
2010-01-08 01:38:20 +01:00
|
|
|
bench=# SELECT pg_stat_statements_reset();
|
2009-01-04 23:19:59 +01:00
|
|
|
|
2010-01-08 01:38:20 +01:00
|
|
|
$ pgbench -i bench
|
2009-01-04 23:19:59 +01:00
|
|
|
$ pgbench -c10 -t300 -M prepared bench
|
|
|
|
|
2010-01-08 01:38:20 +01:00
|
|
|
bench=# \x
|
|
|
|
bench=# SELECT query, calls, total_time, rows, 100.0 * shared_blks_hit /
|
|
|
|
nullif(shared_blks_hit + shared_blks_read, 0) AS hit_percent
|
|
|
|
FROM pg_stat_statements ORDER BY total_time DESC LIMIT 5;
|
|
|
|
-[ RECORD 1 ]---------------------------------------------------------------------
|
|
|
|
query | UPDATE pgbench_branches SET bbalance = bbalance + $1 WHERE bid = $2;
|
|
|
|
calls | 3000
|
|
|
|
total_time | 9.60900100000002
|
|
|
|
rows | 2836
|
|
|
|
hit_percent | 99.9778970000200936
|
|
|
|
-[ RECORD 2 ]---------------------------------------------------------------------
|
|
|
|
query | UPDATE pgbench_tellers SET tbalance = tbalance + $1 WHERE tid = $2;
|
|
|
|
calls | 3000
|
|
|
|
total_time | 8.015156
|
|
|
|
rows | 2990
|
|
|
|
hit_percent | 99.9731126579631345
|
|
|
|
-[ RECORD 3 ]---------------------------------------------------------------------
|
|
|
|
query | copy pgbench_accounts from stdin
|
|
|
|
calls | 1
|
|
|
|
total_time | 0.310624
|
|
|
|
rows | 100000
|
|
|
|
hit_percent | 0.30395136778115501520
|
|
|
|
-[ RECORD 4 ]---------------------------------------------------------------------
|
|
|
|
query | UPDATE pgbench_accounts SET abalance = abalance + $1 WHERE aid = $2;
|
|
|
|
calls | 3000
|
|
|
|
total_time | 0.271741999999997
|
|
|
|
rows | 3000
|
|
|
|
hit_percent | 93.7968855088209426
|
|
|
|
-[ RECORD 5 ]---------------------------------------------------------------------
|
|
|
|
query | alter table pgbench_accounts add primary key (aid)
|
|
|
|
calls | 1
|
|
|
|
total_time | 0.08142
|
|
|
|
rows | 0
|
|
|
|
hit_percent | 34.4947735191637631
|
2010-07-29 21:34:41 +02:00
|
|
|
</screen>
|
2009-01-04 23:19:59 +01:00
|
|
|
</sect2>
|
|
|
|
|
|
|
|
<sect2>
|
|
|
|
<title>Author</title>
|
|
|
|
|
|
|
|
<para>
|
|
|
|
Takahiro Itagaki <email>itagaki.takahiro@oss.ntt.co.jp</email>
|
|
|
|
</para>
|
|
|
|
</sect2>
|
|
|
|
|
|
|
|
</sect1>
|