diff --git a/doc/src/sgml/monitoring.sgml b/doc/src/sgml/monitoring.sgml index 9c5c6dc490f..462019a972c 100644 --- a/doc/src/sgml/monitoring.sgml +++ b/doc/src/sgml/monitoring.sgml @@ -4909,6 +4909,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage Number of buffer hits in this sequence + + + + stats_reset timestamp with time zone + + + Time at which these statistics were last reset + + @@ -5406,6 +5415,8 @@ description | Waiting for a newly initialized WAL file to reach durable storage Resets statistics for a single table or index in the current database or shared across all databases in the cluster to zero. + It also resets statistics for a single sequence or materialized view + in the current database. This function is restricted to superusers by default, but other users diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index 90d48bc9c80..6d6dce18fa3 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -896,7 +896,8 @@ CREATE VIEW pg_statio_all_sequences AS C.relname AS relname, pg_stat_get_blocks_fetched(C.oid) - pg_stat_get_blocks_hit(C.oid) AS blks_read, - pg_stat_get_blocks_hit(C.oid) AS blks_hit + pg_stat_get_blocks_hit(C.oid) AS blks_hit, + pg_stat_get_stat_reset_time(C.oid) AS stats_reset FROM pg_class C LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) WHERE C.relkind = 'S'; diff --git a/src/include/catalog/catversion.h b/src/include/catalog/catversion.h index 3da6a75ff87..aa8708b195d 100644 --- a/src/include/catalog/catversion.h +++ b/src/include/catalog/catversion.h @@ -57,6 +57,6 @@ */ /* yyyymmddN */ -#define CATALOG_VERSION_NO 202603131 +#define CATALOG_VERSION_NO 202603161 #endif diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 71d7262049e..9ed0a1756c0 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2451,7 +2451,8 @@ pg_statio_all_sequences| SELECT c.oid AS relid, n.nspname AS schemaname, c.relname, (pg_stat_get_blocks_fetched(c.oid) - pg_stat_get_blocks_hit(c.oid)) AS blks_read, - pg_stat_get_blocks_hit(c.oid) AS blks_hit + pg_stat_get_blocks_hit(c.oid) AS blks_hit, + pg_stat_get_stat_reset_time(c.oid) AS stats_reset FROM (pg_class c LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) WHERE (c.relkind = 'S'::"char"); @@ -2493,7 +2494,8 @@ pg_statio_sys_sequences| SELECT relid, schemaname, relname, blks_read, - blks_hit + blks_hit, + stats_reset FROM pg_statio_all_sequences WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text)); pg_statio_sys_tables| SELECT relid, @@ -2524,7 +2526,8 @@ pg_statio_user_sequences| SELECT relid, schemaname, relname, blks_read, - blks_hit + blks_hit, + stats_reset FROM pg_statio_all_sequences WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text)); pg_statio_user_tables| SELECT relid, diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index 981d7c90822..8a31521fba2 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -1167,6 +1167,39 @@ SELECT stats_reset > :'dbc_reset_ts'::timestamptz FROM pg_stat_database_conflict t (1 row) +-- Test that reset works for pg_statio_all_sequences +-- Use the sequence to accumulate its stats, and reset them once first +-- so that we have a baseline for comparison, similar to the previous test. +-- stats_reset to compare to. +CREATE SEQUENCE test_seq1; +SELECT nextval('test_seq1'); + nextval +--------- + 1 +(1 row) + +SELECT pg_stat_reset_single_table_counters('test_seq1'::regclass); + pg_stat_reset_single_table_counters +------------------------------------- + +(1 row) + +SELECT stats_reset AS seq_reset_ts + FROM pg_statio_all_sequences WHERE relname ='test_seq1' \gset +SELECT pg_stat_reset_single_table_counters('test_seq1'::regclass); + pg_stat_reset_single_table_counters +------------------------------------- + +(1 row) + +SELECT stats_reset > :'seq_reset_ts'::timestamptz, blks_read + blks_hit + FROM pg_statio_all_sequences WHERE relname ='test_seq1'; + ?column? | ?column? +----------+---------- + t | 0 +(1 row) + +DROP SEQUENCE test_seq1; ---- -- pg_stat_get_snapshot_timestamp behavior ---- diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index 70af96f739f..15add71f734 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -536,6 +536,21 @@ SELECT pg_stat_reset(); SELECT stats_reset > :'db_reset_ts'::timestamptz FROM pg_stat_database WHERE datname = (SELECT current_database()); SELECT stats_reset > :'dbc_reset_ts'::timestamptz FROM pg_stat_database_conflicts WHERE datname = (SELECT current_database()); +-- Test that reset works for pg_statio_all_sequences + +-- Use the sequence to accumulate its stats, and reset them once first +-- so that we have a baseline for comparison, similar to the previous test. +-- stats_reset to compare to. +CREATE SEQUENCE test_seq1; +SELECT nextval('test_seq1'); +SELECT pg_stat_reset_single_table_counters('test_seq1'::regclass); +SELECT stats_reset AS seq_reset_ts + FROM pg_statio_all_sequences WHERE relname ='test_seq1' \gset +SELECT pg_stat_reset_single_table_counters('test_seq1'::regclass); +SELECT stats_reset > :'seq_reset_ts'::timestamptz, blks_read + blks_hit + FROM pg_statio_all_sequences WHERE relname ='test_seq1'; +DROP SEQUENCE test_seq1; + ---- -- pg_stat_get_snapshot_timestamp behavior