*** a/doc/src/sgml/monitoring.sgml --- b/doc/src/sgml/monitoring.sgml *************** *** 1710,1715 **** postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser --- 1710,1723 ---- + pg_stat_snapshot_timestamp()pg_stat_snapshot_timestamp + timestamp with time zone + + Returns the timestamp of the current statistics snapshot + + + + pg_stat_clear_snapshot()pg_stat_clear_snapshot void *** a/src/backend/utils/adt/pgstatfuncs.c --- b/src/backend/utils/adt/pgstatfuncs.c *************** *** 115,120 **** extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS); --- 115,122 ---- extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS); extern Datum pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS); + extern Datum pg_stat_snapshot_timestamp(PG_FUNCTION_ARGS); + extern Datum pg_stat_clear_snapshot(PG_FUNCTION_ARGS); extern Datum pg_stat_reset(PG_FUNCTION_ARGS); extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS); *************** *** 1681,1686 **** pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS) --- 1683,1694 ---- PG_RETURN_FLOAT8(INSTR_TIME_GET_MILLISEC(funcentry->f_counts.f_self_time)); } + /* Get the timestamp of the current statistics snapshot */ + Datum + pg_stat_snapshot_timestamp(PG_FUNCTION_ARGS) + { + PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stats_timestamp); + } /* Discard the active statistics snapshot */ Datum *** a/src/include/catalog/pg_proc.h --- b/src/include/catalog/pg_proc.h *************** *** 2852,2857 **** DESCR("statistics: total execution time of function in current transaction, in m --- 2852,2860 ---- DATA(insert OID = 3048 ( pg_stat_get_xact_function_self_time PGNSP PGUID 12 1 0 0 0 f f f f t f v 1 0 701 "26" _null_ _null_ _null_ _null_ pg_stat_get_xact_function_self_time _null_ _null_ _null_ )); DESCR("statistics: self execution time of function in current transaction, in msec"); + DATA(insert OID = 3788 ( pg_stat_snapshot_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f v 0 0 1184 "" _null_ _null_ _null_ _null_ pg_stat_snapshot_timestamp _null_ _null_ _null_ )); + DESCR("statistics: timestamp of the current statistics snapshot"); + DATA(insert OID = 2230 ( pg_stat_clear_snapshot PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ pg_stat_clear_snapshot _null_ _null_ _null_ )); DESCR("statistics: discard current transaction's statistics snapshot"); DATA(insert OID = 2274 ( pg_stat_reset PGNSP PGUID 12 1 0 0 0 f f f f f f v 0 0 2278 "" _null_ _null_ _null_ _null_ pg_stat_reset _null_ _null_ _null_ )); *** a/src/test/regress/expected/stats.out --- b/src/test/regress/expected/stats.out *************** *** 28,34 **** SELECT pg_sleep_for('2 seconds'); CREATE TEMP TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, ! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; --- 28,35 ---- CREATE TEMP TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, ! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks, ! pg_stat_snapshot_timestamp() as snap_ts FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; *************** *** 111,114 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages, --- 112,122 ---- t | t (1 row) + SELECT pr.snap_ts < pg_stat_snapshot_timestamp() as snapshot_newer + FROM prevstats AS pr; + snapshot_newer + ---------------- + t + (1 row) + -- End of Stats Test *** a/src/test/regress/sql/stats.sql --- b/src/test/regress/sql/stats.sql *************** *** 22,28 **** SELECT pg_sleep_for('2 seconds'); CREATE TEMP TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, ! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; --- 22,29 ---- CREATE TEMP TABLE prevstats AS SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch, (b.heap_blks_read + b.heap_blks_hit) AS heap_blks, ! (b.idx_blks_read + b.idx_blks_hit) AS idx_blks, ! pg_stat_snapshot_timestamp() as snap_ts FROM pg_catalog.pg_stat_user_tables AS t, pg_catalog.pg_statio_user_tables AS b WHERE t.relname='tenk2' AND b.relname='tenk2'; *************** *** 81,84 **** SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages, --- 82,88 ---- FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr WHERE st.relname='tenk2' AND cl.relname='tenk2'; + SELECT pr.snap_ts < pg_stat_snapshot_timestamp() as snapshot_newer + FROM prevstats AS pr; + -- End of Stats Test