diff options
-rw-r--r-- | contrib/pg_stat_statements/Makefile | 2 | ||||
-rw-r--r-- | contrib/pg_stat_statements/expected/pg_stat_statements.out | 15 | ||||
-rw-r--r-- | contrib/pg_stat_statements/pg_stat_statements--1.8--1.9.sql | 17 | ||||
-rw-r--r-- | contrib/pg_stat_statements/pg_stat_statements.c | 59 | ||||
-rw-r--r-- | contrib/pg_stat_statements/pg_stat_statements.control | 2 | ||||
-rw-r--r-- | contrib/pg_stat_statements/sql/pg_stat_statements.sql | 6 | ||||
-rw-r--r-- | doc/src/sgml/pgstatstatements.sgml | 61 | ||||
-rw-r--r-- | src/tools/pgindent/typedefs.list | 1 |
8 files changed, 155 insertions, 8 deletions
diff --git a/contrib/pg_stat_statements/Makefile b/contrib/pg_stat_statements/Makefile index 081f997d703..3ec627b9561 100644 --- a/contrib/pg_stat_statements/Makefile +++ b/contrib/pg_stat_statements/Makefile @@ -6,7 +6,7 @@ OBJS = \ pg_stat_statements.o EXTENSION = pg_stat_statements -DATA = pg_stat_statements--1.4.sql \ +DATA = pg_stat_statements--1.4.sql pg_stat_statements--1.8--1.9.sql \ pg_stat_statements--1.7--1.8.sql pg_stat_statements--1.6--1.7.sql \ pg_stat_statements--1.5--1.6.sql pg_stat_statements--1.4--1.5.sql \ pg_stat_statements--1.3--1.4.sql pg_stat_statements--1.2--1.3.sql \ diff --git a/contrib/pg_stat_statements/expected/pg_stat_statements.out b/contrib/pg_stat_statements/expected/pg_stat_statements.out index 2a303a7f073..16158525cac 100644 --- a/contrib/pg_stat_statements/expected/pg_stat_statements.out +++ b/contrib/pg_stat_statements/expected/pg_stat_statements.out @@ -861,4 +861,19 @@ SELECT query, plans, calls, rows FROM pg_stat_statements ORDER BY query COLLATE SELECT query, plans, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C" | 1 | 0 | 0 (6 rows) +-- +-- access to pg_stat_statements_info view +-- +SELECT pg_stat_statements_reset(); + pg_stat_statements_reset +-------------------------- + +(1 row) + +SELECT dealloc FROM pg_stat_statements_info; + dealloc +--------- + 0 +(1 row) + DROP EXTENSION pg_stat_statements; diff --git a/contrib/pg_stat_statements/pg_stat_statements--1.8--1.9.sql b/contrib/pg_stat_statements/pg_stat_statements--1.8--1.9.sql new file mode 100644 index 00000000000..2019a4ffe03 --- /dev/null +++ b/contrib/pg_stat_statements/pg_stat_statements--1.8--1.9.sql @@ -0,0 +1,17 @@ +/* contrib/pg_stat_statements/pg_stat_statements--1.8--1.9.sql */ + +-- complain if script is sourced in psql, rather than via ALTER EXTENSION +\echo Use "ALTER EXTENSION pg_stat_statements UPDATE TO '1.9'" to load this file. \quit + +--- Define pg_stat_statements_info +CREATE FUNCTION pg_stat_statements_info( + OUT dealloc bigint +) +RETURNS bigint +AS 'MODULE_PATHNAME' +LANGUAGE C STRICT VOLATILE PARALLEL SAFE; + +CREATE VIEW pg_stat_statements_info AS + SELECT * FROM pg_stat_statements_info(); + +GRANT SELECT ON pg_stat_statements_info TO PUBLIC; diff --git a/contrib/pg_stat_statements/pg_stat_statements.c b/contrib/pg_stat_statements/pg_stat_statements.c index dd963c4644a..70cfdb2c9d1 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.c +++ b/contrib/pg_stat_statements/pg_stat_statements.c @@ -98,7 +98,7 @@ PG_MODULE_MAGIC; #define PGSS_TEXT_FILE PG_STAT_TMP_DIR "/pgss_query_texts.stat" /* Magic number identifying the stats file format */ -static const uint32 PGSS_FILE_HEADER = 0x20171004; +static const uint32 PGSS_FILE_HEADER = 0x20201126; /* PostgreSQL major version number, changes in which invalidate all entries */ static const uint32 PGSS_PG_MAJOR_VERSION = PG_VERSION_NUM / 100; @@ -194,6 +194,14 @@ typedef struct Counters } Counters; /* + * Global statistics for pg_stat_statements + */ +typedef struct pgssGlobalStats +{ + int64 dealloc; /* # of times entries were deallocated */ +} pgssGlobalStats; + +/* * Statistics per statement * * Note: in event of a failure in garbage collection of the query text file, @@ -222,6 +230,7 @@ typedef struct pgssSharedState Size extent; /* current extent of query file */ int n_writers; /* number of active writers to query file */ int gc_count; /* query file garbage collection cycle count */ + pgssGlobalStats stats; /* global statistics for pgss */ } pgssSharedState; /* @@ -327,6 +336,7 @@ PG_FUNCTION_INFO_V1(pg_stat_statements_1_2); PG_FUNCTION_INFO_V1(pg_stat_statements_1_3); PG_FUNCTION_INFO_V1(pg_stat_statements_1_8); PG_FUNCTION_INFO_V1(pg_stat_statements); +PG_FUNCTION_INFO_V1(pg_stat_statements_info); static void pgss_shmem_startup(void); static void pgss_shmem_shutdown(int code, Datum arg); @@ -554,6 +564,7 @@ pgss_shmem_startup(void) pgss->extent = 0; pgss->n_writers = 0; pgss->gc_count = 0; + pgss->stats.dealloc = 0; } memset(&info, 0, sizeof(info)); @@ -673,6 +684,10 @@ pgss_shmem_startup(void) entry->counters = temp.counters; } + /* Read global statistics for pg_stat_statements */ + if (fread(&pgss->stats, sizeof(pgssGlobalStats), 1, file) != 1) + goto read_error; + pfree(buffer); FreeFile(file); FreeFile(qfile); @@ -794,6 +809,10 @@ pgss_shmem_shutdown(int code, Datum arg) } } + /* Dump global statistics for pg_stat_statements */ + if (fwrite(&pgss->stats, sizeof(pgssGlobalStats), 1, file) != 1) + goto error; + free(qbuffer); qbuffer = NULL; @@ -1864,6 +1883,26 @@ pg_stat_statements_internal(FunctionCallInfo fcinfo, } /* + * Return statistics of pg_stat_statements. + */ +Datum +pg_stat_statements_info(PG_FUNCTION_ARGS) +{ + pgssGlobalStats stats; + + /* Read global statistics for pg_stat_statements */ + { + volatile pgssSharedState *s = (volatile pgssSharedState *) pgss; + + SpinLockAcquire(&s->mutex); + stats = s->stats; + SpinLockRelease(&s->mutex); + } + + PG_RETURN_INT64(stats.dealloc); +} + +/* * Estimate shared memory space needed. */ static Size @@ -2018,6 +2057,15 @@ entry_dealloc(void) } pfree(entries); + + /* Increment the number of times entries are deallocated */ + { + volatile pgssSharedState *s = (volatile pgssSharedState *) pgss; + + SpinLockAcquire(&s->mutex); + s->stats.dealloc += 1; + SpinLockRelease(&s->mutex); + } } /* @@ -2504,6 +2552,15 @@ entry_reset(Oid userid, Oid dbid, uint64 queryid) hash_search(pgss_hash, &entry->key, HASH_REMOVE, NULL); num_remove++; } + + /* Reset global statistics for pg_stat_statements */ + { + volatile pgssSharedState *s = (volatile pgssSharedState *) pgss; + + SpinLockAcquire(&s->mutex); + s->stats.dealloc = 0; + SpinLockRelease(&s->mutex); + } } /* All entries are removed? */ diff --git a/contrib/pg_stat_statements/pg_stat_statements.control b/contrib/pg_stat_statements/pg_stat_statements.control index 65b18b11d25..2f1ce6ed507 100644 --- a/contrib/pg_stat_statements/pg_stat_statements.control +++ b/contrib/pg_stat_statements/pg_stat_statements.control @@ -1,5 +1,5 @@ # pg_stat_statements extension comment = 'track planning and execution statistics of all SQL statements executed' -default_version = '1.8' +default_version = '1.9' module_pathname = '$libdir/pg_stat_statements' relocatable = true diff --git a/contrib/pg_stat_statements/sql/pg_stat_statements.sql b/contrib/pg_stat_statements/sql/pg_stat_statements.sql index e9f5bb84e38..6f58d9d0f66 100644 --- a/contrib/pg_stat_statements/sql/pg_stat_statements.sql +++ b/contrib/pg_stat_statements/sql/pg_stat_statements.sql @@ -358,4 +358,10 @@ SELECT 42; SELECT 42; SELECT query, plans, calls, rows FROM pg_stat_statements ORDER BY query COLLATE "C"; +-- +-- access to pg_stat_statements_info view +-- +SELECT pg_stat_statements_reset(); +SELECT dealloc FROM pg_stat_statements_info; + DROP EXTENSION pg_stat_statements; diff --git a/doc/src/sgml/pgstatstatements.sgml b/doc/src/sgml/pgstatstatements.sgml index cf2d25b7b22..81915ea69bb 100644 --- a/doc/src/sgml/pgstatstatements.sgml +++ b/doc/src/sgml/pgstatstatements.sgml @@ -23,7 +23,9 @@ <para> When <filename>pg_stat_statements</filename> is loaded, it tracks statistics across all databases of the server. To access and manipulate - these statistics, the module provides a view, <structname>pg_stat_statements</structname>, + these statistics, the module provides views + <structname>pg_stat_statements</structname> and + <structname>pg_stat_statements_info</structname>, and the utility functions <function>pg_stat_statements_reset</function> and <function>pg_stat_statements</function>. These are not available globally but can be enabled for a specific database with @@ -481,6 +483,52 @@ </sect2> <sect2> + <title>The <structname>pg_stat_statements_info</structname> View</title> + + <indexterm> + <primary>pg_stat_statements_info</primary> + </indexterm> + + <para> + The statistics of the <filename>pg_stat_statements</filename> module + itself are tracked and made available via a view named + <structname>pg_stat_statements_info</structname>. This view contains + only a single row. The columns of the view are shown in + <xref linkend="pgstatstatementsinfo-columns"/>. + </para> + + <table id="pgstatstatementsinfo-columns"> + <title><structname>pg_stat_statements_info</structname> Columns</title> + <tgroup cols="1"> + <thead> + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + Column Type + </para> + <para> + Description + </para></entry> + </row> + </thead> + + <tbody> + <row> + <entry role="catalog_table_entry"><para role="column_definition"> + <structfield>dealloc</structfield> <type>bigint</type> + </para> + <para> + Total number of times <structname>pg_stat_statements</structname> + entries about the least-executed statements were deallocated + because more distinct statements than + <varname>pg_stat_statements.max</varname> were observed + </para></entry> + </row> + </tbody> + </tgroup> + </table> + </sect2> + + <sect2> <title>Functions</title> <variablelist> @@ -501,9 +549,10 @@ specified, the default value <literal>0</literal>(invalid) is used for each of them and the statistics that match with other parameters will be reset. If no parameter is specified or all the specified parameters are - <literal>0</literal>(invalid), it will discard all statistics. By - default, this function can only be executed by superusers. Access may be - granted to others using <command>GRANT</command>. + <literal>0</literal>(invalid), it will discard all statistics including + the statistics that <structname>pg_stat_statements_info</structname> + displays. By default, this function can only be executed by superusers. + Access may be granted to others using <command>GRANT</command>. </para> </listitem> </varlistentry> @@ -555,7 +604,9 @@ statements tracked by the module (i.e., the maximum number of rows in the <structname>pg_stat_statements</structname> view). If more distinct statements than that are observed, information about the least-executed - statements is discarded. + statements is discarded. The number of times such information was + discarded can be seen in the + <structname>pg_stat_statements_info</structname> view. The default value is 5000. This parameter can only be set at server start. </para> diff --git a/src/tools/pgindent/typedefs.list b/src/tools/pgindent/typedefs.list index 4c40ae37b26..b8ca8cffd91 100644 --- a/src/tools/pgindent/typedefs.list +++ b/src/tools/pgindent/typedefs.list @@ -3215,6 +3215,7 @@ pgpid_t pgsocket pgsql_thing_t pgssEntry +pgssGlobalStats pgssHashKey pgssJumbleState pgssLocationLen |