Add pg_stat_get_snapshot_timestamp() to show statistics snapshot timestamp.
Per discussion, this could be useful for purposes such as programmatically detecting a nonresponding stats collector. We already have the timestamp anyway, it's just a matter of providing a SQL-accessible function to fetch it. Matt Kelly, reviewed by Jim Nasby
This commit is contained in:
parent
634618ecd0
commit
2fb7a75f37
@ -1709,6 +1709,14 @@ postgres 27093 0.0 0.0 30096 2752 ? Ss 11:34 0:00 postgres: ser
|
|||||||
</entry>
|
</entry>
|
||||||
</row>
|
</row>
|
||||||
|
|
||||||
|
<row>
|
||||||
|
<entry><literal><function>pg_stat_get_snapshot_timestamp()</function></literal><indexterm><primary>pg_stat_get_snapshot_timestamp</primary></indexterm></entry>
|
||||||
|
<entry><type>timestamp with time zone</type></entry>
|
||||||
|
<entry>
|
||||||
|
Returns the timestamp of the current statistics snapshot
|
||||||
|
</entry>
|
||||||
|
</row>
|
||||||
|
|
||||||
<row>
|
<row>
|
||||||
<entry><literal><function>pg_stat_clear_snapshot()</function></literal><indexterm><primary>pg_stat_clear_snapshot</primary></indexterm></entry>
|
<entry><literal><function>pg_stat_clear_snapshot()</function></literal><indexterm><primary>pg_stat_clear_snapshot</primary></indexterm></entry>
|
||||||
<entry><type>void</type></entry>
|
<entry><type>void</type></entry>
|
||||||
|
@ -115,6 +115,7 @@ extern Datum pg_stat_get_xact_function_calls(PG_FUNCTION_ARGS);
|
|||||||
extern Datum pg_stat_get_xact_function_total_time(PG_FUNCTION_ARGS);
|
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_get_xact_function_self_time(PG_FUNCTION_ARGS);
|
||||||
|
|
||||||
|
extern Datum pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_stat_clear_snapshot(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(PG_FUNCTION_ARGS);
|
||||||
extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
|
extern Datum pg_stat_reset_shared(PG_FUNCTION_ARGS);
|
||||||
@ -1682,6 +1683,13 @@ pg_stat_get_xact_function_self_time(PG_FUNCTION_ARGS)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Get the timestamp of the current statistics snapshot */
|
||||||
|
Datum
|
||||||
|
pg_stat_get_snapshot_timestamp(PG_FUNCTION_ARGS)
|
||||||
|
{
|
||||||
|
PG_RETURN_TIMESTAMPTZ(pgstat_fetch_global()->stats_timestamp);
|
||||||
|
}
|
||||||
|
|
||||||
/* Discard the active statistics snapshot */
|
/* Discard the active statistics snapshot */
|
||||||
Datum
|
Datum
|
||||||
pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
|
pg_stat_clear_snapshot(PG_FUNCTION_ARGS)
|
||||||
|
@ -53,6 +53,6 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* yyyymmddN */
|
/* yyyymmddN */
|
||||||
#define CATALOG_VERSION_NO 201502181
|
#define CATALOG_VERSION_NO 201502191
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -2852,6 +2852,8 @@ DESCR("statistics: total execution time of function in current transaction, in m
|
|||||||
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_ ));
|
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");
|
DESCR("statistics: self execution time of function in current transaction, in msec");
|
||||||
|
|
||||||
|
DATA(insert OID = 3788 ( pg_stat_get_snapshot_timestamp PGNSP PGUID 12 1 0 0 0 f f f f t f s 0 0 1184 "" _null_ _null_ _null_ _null_ pg_stat_get_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_ ));
|
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");
|
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_ ));
|
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_ ));
|
||||||
|
@ -28,7 +28,8 @@ SELECT pg_sleep_for('2 seconds');
|
|||||||
CREATE TEMP TABLE prevstats AS
|
CREATE TEMP TABLE prevstats AS
|
||||||
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
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.heap_blks_read + b.heap_blks_hit) AS heap_blks,
|
||||||
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks
|
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
|
||||||
|
pg_stat_get_snapshot_timestamp() as snap_ts
|
||||||
FROM pg_catalog.pg_stat_user_tables AS t,
|
FROM pg_catalog.pg_stat_user_tables AS t,
|
||||||
pg_catalog.pg_statio_user_tables AS b
|
pg_catalog.pg_statio_user_tables AS b
|
||||||
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
||||||
@ -111,4 +112,11 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
|||||||
t | t
|
t | t
|
||||||
(1 row)
|
(1 row)
|
||||||
|
|
||||||
|
SELECT pr.snap_ts < pg_stat_get_snapshot_timestamp() as snapshot_newer
|
||||||
|
FROM prevstats AS pr;
|
||||||
|
snapshot_newer
|
||||||
|
----------------
|
||||||
|
t
|
||||||
|
(1 row)
|
||||||
|
|
||||||
-- End of Stats Test
|
-- End of Stats Test
|
||||||
|
@ -22,7 +22,8 @@ SELECT pg_sleep_for('2 seconds');
|
|||||||
CREATE TEMP TABLE prevstats AS
|
CREATE TEMP TABLE prevstats AS
|
||||||
SELECT t.seq_scan, t.seq_tup_read, t.idx_scan, t.idx_tup_fetch,
|
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.heap_blks_read + b.heap_blks_hit) AS heap_blks,
|
||||||
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks
|
(b.idx_blks_read + b.idx_blks_hit) AS idx_blks,
|
||||||
|
pg_stat_get_snapshot_timestamp() as snap_ts
|
||||||
FROM pg_catalog.pg_stat_user_tables AS t,
|
FROM pg_catalog.pg_stat_user_tables AS t,
|
||||||
pg_catalog.pg_statio_user_tables AS b
|
pg_catalog.pg_statio_user_tables AS b
|
||||||
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
WHERE t.relname='tenk2' AND b.relname='tenk2';
|
||||||
@ -81,4 +82,7 @@ SELECT st.heap_blks_read + st.heap_blks_hit >= pr.heap_blks + cl.relpages,
|
|||||||
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
FROM pg_statio_user_tables AS st, pg_class AS cl, prevstats AS pr
|
||||||
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
WHERE st.relname='tenk2' AND cl.relname='tenk2';
|
||||||
|
|
||||||
|
SELECT pr.snap_ts < pg_stat_get_snapshot_timestamp() as snapshot_newer
|
||||||
|
FROM prevstats AS pr;
|
||||||
|
|
||||||
-- End of Stats Test
|
-- End of Stats Test
|
||||||
|
Loading…
x
Reference in New Issue
Block a user