1
0
mirror of https://github.com/postgres/postgres.git synced 2025-10-16 17:07:43 +03:00

Add stats_reset to pg_stat_all_{tables,indexes} and related views

It is possible to call pg_stat_reset_single_table_counters() on a
relation (index or table) but the reset time was missing from the system
views showing their statistics.

This commit adds the reset time as an attribute of pg_stat_all_tables,
pg_stat_all_indexes, and other relations related to them.

Bump catalog version.
Bump PGSTAT_FILE_FORMAT_ID, as a result of the new field added to
PgStat_StatTabEntry.

Author: Bertrand Drouvot <bertranddrouvot.pg@gmail.com>
Reviewed-by: Sami Imseih <samimseih@gmail.com>
Reviewed-by: Michael Paquier <michael@paquier.xyz>
Discussion: https://postgr.es/m/aN8l182jKxEq1h9f@paquier.xyz
This commit is contained in:
Michael Paquier
2025-10-06 15:31:21 +09:00
parent c173aaff98
commit a5b543258a
12 changed files with 117 additions and 33 deletions

View File

@@ -4115,6 +4115,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage
cost-based delays.) cost-based delays.)
</para></entry> </para></entry>
</row> </row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
</para>
<para>
Time at which these statistics were last reset
</para></entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
@@ -4235,6 +4244,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage
index index
</para></entry> </para></entry>
</row> </row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
</para>
<para>
Time at which these statistics were last reset
</para></entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
@@ -4432,6 +4450,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage
Number of buffer hits in this table's TOAST table indexes (if any) Number of buffer hits in this table's TOAST table indexes (if any)
</para></entry> </para></entry>
</row> </row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
</para>
<para>
Time at which these statistics were last reset
</para></entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>
@@ -4532,6 +4559,15 @@ description | Waiting for a newly initialized WAL file to reach durable storage
Number of buffer hits in this index Number of buffer hits in this index
</para></entry> </para></entry>
</row> </row>
<row>
<entry role="catalog_table_entry"><para role="column_definition">
<structfield>stats_reset</structfield> <type>timestamp with time zone</type>
</para>
<para>
Time at which these statistics were last reset
</para></entry>
</row>
</tbody> </tbody>
</tgroup> </tgroup>
</table> </table>

View File

@@ -716,7 +716,8 @@ CREATE VIEW pg_stat_all_tables AS
pg_stat_get_total_vacuum_time(C.oid) AS total_vacuum_time, pg_stat_get_total_vacuum_time(C.oid) AS total_vacuum_time,
pg_stat_get_total_autovacuum_time(C.oid) AS total_autovacuum_time, pg_stat_get_total_autovacuum_time(C.oid) AS total_autovacuum_time,
pg_stat_get_total_analyze_time(C.oid) AS total_analyze_time, pg_stat_get_total_analyze_time(C.oid) AS total_analyze_time,
pg_stat_get_total_autoanalyze_time(C.oid) AS total_autoanalyze_time pg_stat_get_total_autoanalyze_time(C.oid) AS total_autoanalyze_time,
pg_stat_get_stat_reset_time(C.oid) AS stats_reset
FROM pg_class C LEFT JOIN FROM pg_class C LEFT JOIN
pg_index I ON C.oid = I.indrelid pg_index I ON C.oid = I.indrelid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -778,7 +779,8 @@ CREATE VIEW pg_statio_all_tables AS
pg_stat_get_blocks_hit(T.oid) AS toast_blks_read, pg_stat_get_blocks_hit(T.oid) AS toast_blks_read,
pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit, pg_stat_get_blocks_hit(T.oid) AS toast_blks_hit,
X.idx_blks_read AS tidx_blks_read, X.idx_blks_read AS tidx_blks_read,
X.idx_blks_hit AS tidx_blks_hit X.idx_blks_hit AS tidx_blks_hit,
pg_stat_get_stat_reset_time(C.oid) AS stats_reset
FROM pg_class C LEFT JOIN FROM pg_class C LEFT JOIN
pg_class T ON C.reltoastrelid = T.oid pg_class T ON C.reltoastrelid = T.oid
LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace) LEFT JOIN pg_namespace N ON (N.oid = C.relnamespace)
@@ -818,7 +820,8 @@ CREATE VIEW pg_stat_all_indexes AS
pg_stat_get_numscans(I.oid) AS idx_scan, pg_stat_get_numscans(I.oid) AS idx_scan,
pg_stat_get_lastscan(I.oid) AS last_idx_scan, pg_stat_get_lastscan(I.oid) AS last_idx_scan,
pg_stat_get_tuples_returned(I.oid) AS idx_tup_read, pg_stat_get_tuples_returned(I.oid) AS idx_tup_read,
pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch pg_stat_get_tuples_fetched(I.oid) AS idx_tup_fetch,
pg_stat_get_stat_reset_time(I.oid) AS stats_reset
FROM pg_class C JOIN FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid pg_class I ON I.oid = X.indexrelid
@@ -844,7 +847,8 @@ CREATE VIEW pg_statio_all_indexes AS
I.relname AS indexrelname, I.relname AS indexrelname,
pg_stat_get_blocks_fetched(I.oid) - pg_stat_get_blocks_fetched(I.oid) -
pg_stat_get_blocks_hit(I.oid) AS idx_blks_read, pg_stat_get_blocks_hit(I.oid) AS idx_blks_read,
pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit pg_stat_get_blocks_hit(I.oid) AS idx_blks_hit,
pg_stat_get_stat_reset_time(I.oid) AS stats_reset
FROM pg_class C JOIN FROM pg_class C JOIN
pg_index X ON C.oid = X.indrelid JOIN pg_index X ON C.oid = X.indrelid JOIN
pg_class I ON I.oid = X.indexrelid pg_class I ON I.oid = X.indexrelid

View File

@@ -313,6 +313,7 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE]
.flush_pending_cb = pgstat_relation_flush_cb, .flush_pending_cb = pgstat_relation_flush_cb,
.delete_pending_cb = pgstat_relation_delete_pending_cb, .delete_pending_cb = pgstat_relation_delete_pending_cb,
.reset_timestamp_cb = pgstat_relation_reset_timestamp_cb,
}, },
[PGSTAT_KIND_FUNCTION] = { [PGSTAT_KIND_FUNCTION] = {

View File

@@ -910,6 +910,12 @@ pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref)
pgstat_unlink_relation(pending->relation); pgstat_unlink_relation(pending->relation);
} }
void
pgstat_relation_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts)
{
((PgStatShared_Relation *) header)->stats.stat_reset_time = ts;
}
/* /*
* Find or create a PgStat_TableStatus entry for rel. New entry is created and * Find or create a PgStat_TableStatus entry for rel. New entry is created and
* initialized if not exists. * initialized if not exists.

View File

@@ -168,6 +168,9 @@ PG_STAT_GET_RELENTRY_TIMESTAMPTZ(last_vacuum_time)
/* pg_stat_get_lastscan */ /* pg_stat_get_lastscan */
PG_STAT_GET_RELENTRY_TIMESTAMPTZ(lastscan) PG_STAT_GET_RELENTRY_TIMESTAMPTZ(lastscan)
/* pg_stat_get_stat_reset_time */
PG_STAT_GET_RELENTRY_TIMESTAMPTZ(stat_reset_time)
Datum Datum
pg_stat_get_function_calls(PG_FUNCTION_ARGS) pg_stat_get_function_calls(PG_FUNCTION_ARGS)
{ {

View File

@@ -57,6 +57,6 @@
*/ */
/* yyyymmddN */ /* yyyymmddN */
#define CATALOG_VERSION_NO 202509291 #define CATALOG_VERSION_NO 202510061
#endif #endif

View File

@@ -5537,6 +5537,10 @@
proname => 'pg_stat_get_lastscan', provolatile => 's', proparallel => 'r', proname => 'pg_stat_get_lastscan', provolatile => 's', proparallel => 'r',
prorettype => 'timestamptz', proargtypes => 'oid', prorettype => 'timestamptz', proargtypes => 'oid',
prosrc => 'pg_stat_get_lastscan' }, prosrc => 'pg_stat_get_lastscan' },
{ oid => '9127', descr => 'statistics: last reset for a relation',
proname => 'pg_stat_get_stat_reset_time', provolatile => 's',
proparallel => 'r', prorettype => 'timestamptz', proargtypes => 'oid',
prosrc => 'pg_stat_get_stat_reset_time' },
{ oid => '1929', descr => 'statistics: number of tuples read by seqscan', { oid => '1929', descr => 'statistics: number of tuples read by seqscan',
proname => 'pg_stat_get_tuples_returned', provolatile => 's', proname => 'pg_stat_get_tuples_returned', provolatile => 's',
proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', proparallel => 'r', prorettype => 'int8', proargtypes => 'oid',

View File

@@ -212,7 +212,7 @@ typedef struct PgStat_TableXactStatus
* ------------------------------------------------------------ * ------------------------------------------------------------
*/ */
#define PGSTAT_FILE_FORMAT_ID 0x01A5BCB7 #define PGSTAT_FILE_FORMAT_ID 0x01A5BCB8
typedef struct PgStat_ArchiverStats typedef struct PgStat_ArchiverStats
{ {
@@ -454,6 +454,8 @@ typedef struct PgStat_StatTabEntry
PgStat_Counter total_autovacuum_time; PgStat_Counter total_autovacuum_time;
PgStat_Counter total_analyze_time; PgStat_Counter total_analyze_time;
PgStat_Counter total_autoanalyze_time; PgStat_Counter total_autoanalyze_time;
TimestampTz stat_reset_time;
} PgStat_StatTabEntry; } PgStat_StatTabEntry;
/* ------ /* ------

View File

@@ -716,6 +716,7 @@ extern void PostPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state);
extern bool pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); extern bool pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait);
extern void pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref); extern void pgstat_relation_delete_pending_cb(PgStat_EntryRef *entry_ref);
extern void pgstat_relation_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts);
/* /*

View File

@@ -1798,7 +1798,8 @@ pg_stat_all_indexes| SELECT c.oid AS relid,
pg_stat_get_numscans(i.oid) AS idx_scan, pg_stat_get_numscans(i.oid) AS idx_scan,
pg_stat_get_lastscan(i.oid) AS last_idx_scan, pg_stat_get_lastscan(i.oid) AS last_idx_scan,
pg_stat_get_tuples_returned(i.oid) AS idx_tup_read, pg_stat_get_tuples_returned(i.oid) AS idx_tup_read,
pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch pg_stat_get_tuples_fetched(i.oid) AS idx_tup_fetch,
pg_stat_get_stat_reset_time(i.oid) AS stats_reset
FROM (((pg_class c FROM (((pg_class c
JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_index x ON ((c.oid = x.indrelid)))
JOIN pg_class i ON ((i.oid = x.indexrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid)))
@@ -1833,7 +1834,8 @@ pg_stat_all_tables| SELECT c.oid AS relid,
pg_stat_get_total_vacuum_time(c.oid) AS total_vacuum_time, pg_stat_get_total_vacuum_time(c.oid) AS total_vacuum_time,
pg_stat_get_total_autovacuum_time(c.oid) AS total_autovacuum_time, pg_stat_get_total_autovacuum_time(c.oid) AS total_autovacuum_time,
pg_stat_get_total_analyze_time(c.oid) AS total_analyze_time, pg_stat_get_total_analyze_time(c.oid) AS total_analyze_time,
pg_stat_get_total_autoanalyze_time(c.oid) AS total_autoanalyze_time pg_stat_get_total_autoanalyze_time(c.oid) AS total_autoanalyze_time,
pg_stat_get_stat_reset_time(c.oid) AS stats_reset
FROM ((pg_class c FROM ((pg_class c
LEFT JOIN pg_index i ON ((c.oid = i.indrelid))) LEFT JOIN pg_index i ON ((c.oid = i.indrelid)))
LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
@@ -2200,7 +2202,8 @@ pg_stat_sys_indexes| SELECT relid,
idx_scan, idx_scan,
last_idx_scan, last_idx_scan,
idx_tup_read, idx_tup_read,
idx_tup_fetch idx_tup_fetch,
stats_reset
FROM pg_stat_all_indexes FROM pg_stat_all_indexes
WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text)); WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text));
pg_stat_sys_tables| SELECT relid, pg_stat_sys_tables| SELECT relid,
@@ -2232,7 +2235,8 @@ pg_stat_sys_tables| SELECT relid,
total_vacuum_time, total_vacuum_time,
total_autovacuum_time, total_autovacuum_time,
total_analyze_time, total_analyze_time,
total_autoanalyze_time total_autoanalyze_time,
stats_reset
FROM pg_stat_all_tables FROM pg_stat_all_tables
WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text)); WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text));
pg_stat_user_functions| SELECT p.oid AS funcid, pg_stat_user_functions| SELECT p.oid AS funcid,
@@ -2252,7 +2256,8 @@ pg_stat_user_indexes| SELECT relid,
idx_scan, idx_scan,
last_idx_scan, last_idx_scan,
idx_tup_read, idx_tup_read,
idx_tup_fetch idx_tup_fetch,
stats_reset
FROM pg_stat_all_indexes FROM pg_stat_all_indexes
WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text)); WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text));
pg_stat_user_tables| SELECT relid, pg_stat_user_tables| SELECT relid,
@@ -2284,7 +2289,8 @@ pg_stat_user_tables| SELECT relid,
total_vacuum_time, total_vacuum_time,
total_autovacuum_time, total_autovacuum_time,
total_analyze_time, total_analyze_time,
total_autoanalyze_time total_autoanalyze_time,
stats_reset
FROM pg_stat_all_tables FROM pg_stat_all_tables
WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text)); WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text));
pg_stat_wal| SELECT wal_records, pg_stat_wal| SELECT wal_records,
@@ -2370,7 +2376,8 @@ pg_statio_all_indexes| SELECT c.oid AS relid,
c.relname, c.relname,
i.relname AS indexrelname, i.relname AS indexrelname,
(pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read, (pg_stat_get_blocks_fetched(i.oid) - pg_stat_get_blocks_hit(i.oid)) AS idx_blks_read,
pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit pg_stat_get_blocks_hit(i.oid) AS idx_blks_hit,
pg_stat_get_stat_reset_time(i.oid) AS stats_reset
FROM (((pg_class c FROM (((pg_class c
JOIN pg_index x ON ((c.oid = x.indrelid))) JOIN pg_index x ON ((c.oid = x.indrelid)))
JOIN pg_class i ON ((i.oid = x.indexrelid))) JOIN pg_class i ON ((i.oid = x.indexrelid)))
@@ -2394,7 +2401,8 @@ pg_statio_all_tables| SELECT c.oid AS relid,
(pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read, (pg_stat_get_blocks_fetched(t.oid) - pg_stat_get_blocks_hit(t.oid)) AS toast_blks_read,
pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit, pg_stat_get_blocks_hit(t.oid) AS toast_blks_hit,
x.idx_blks_read AS tidx_blks_read, x.idx_blks_read AS tidx_blks_read,
x.idx_blks_hit AS tidx_blks_hit x.idx_blks_hit AS tidx_blks_hit,
pg_stat_get_stat_reset_time(c.oid) AS stats_reset
FROM ((((pg_class c FROM ((((pg_class c
LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid))) LEFT JOIN pg_class t ON ((c.reltoastrelid = t.oid)))
LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace))) LEFT JOIN pg_namespace n ON ((n.oid = c.relnamespace)))
@@ -2413,7 +2421,8 @@ pg_statio_sys_indexes| SELECT relid,
relname, relname,
indexrelname, indexrelname,
idx_blks_read, idx_blks_read,
idx_blks_hit idx_blks_hit,
stats_reset
FROM pg_statio_all_indexes FROM pg_statio_all_indexes
WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text)); WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text));
pg_statio_sys_sequences| SELECT relid, pg_statio_sys_sequences| SELECT relid,
@@ -2433,7 +2442,8 @@ pg_statio_sys_tables| SELECT relid,
toast_blks_read, toast_blks_read,
toast_blks_hit, toast_blks_hit,
tidx_blks_read, tidx_blks_read,
tidx_blks_hit tidx_blks_hit,
stats_reset
FROM pg_statio_all_tables FROM pg_statio_all_tables
WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text)); WHERE ((schemaname = ANY (ARRAY['pg_catalog'::name, 'information_schema'::name])) OR (schemaname ~ '^pg_toast'::text));
pg_statio_user_indexes| SELECT relid, pg_statio_user_indexes| SELECT relid,
@@ -2442,7 +2452,8 @@ pg_statio_user_indexes| SELECT relid,
relname, relname,
indexrelname, indexrelname,
idx_blks_read, idx_blks_read,
idx_blks_hit idx_blks_hit,
stats_reset
FROM pg_statio_all_indexes FROM pg_statio_all_indexes
WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text)); WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text));
pg_statio_user_sequences| SELECT relid, pg_statio_user_sequences| SELECT relid,
@@ -2462,7 +2473,8 @@ pg_statio_user_tables| SELECT relid,
toast_blks_read, toast_blks_read,
toast_blks_hit, toast_blks_hit,
tidx_blks_read, tidx_blks_read,
tidx_blks_hit tidx_blks_hit,
stats_reset
FROM pg_statio_all_tables FROM pg_statio_all_tables
WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text)); WHERE ((schemaname <> ALL (ARRAY['pg_catalog'::name, 'information_schema'::name])) AND (schemaname !~ '^pg_toast'::text));
pg_stats| SELECT n.nspname AS schemaname, pg_stats| SELECT n.nspname AS schemaname,

View File

@@ -666,16 +666,24 @@ SELECT last_seq_scan, last_idx_scan FROM pg_stat_all_tables WHERE relid = 'test_
(1 row) (1 row)
COMMIT; COMMIT;
SELECT stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
has_stats_reset
-----------------
f
(1 row)
SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass);
pg_stat_reset_single_table_counters pg_stat_reset_single_table_counters
------------------------------------- -------------------------------------
(1 row) (1 row)
SELECT seq_scan, idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; SELECT seq_scan, idx_scan, stats_reset IS NOT NULL AS has_stats_reset
seq_scan | idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
----------+---------- seq_scan | idx_scan | has_stats_reset
0 | 0 ----------+----------+-----------------
0 | 0 | t
(1 row) (1 row)
-- ensure we start out with exactly one index and sequential scan -- ensure we start out with exactly one index and sequential scan
@@ -851,11 +859,12 @@ FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
(1 row) (1 row)
-- check the stats in pg_stat_all_indexes -- check the stats in pg_stat_all_indexes
SELECT idx_scan, :'test_last_idx' < last_idx_scan AS idx_ok SELECT idx_scan, :'test_last_idx' < last_idx_scan AS idx_ok,
stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass; FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass;
idx_scan | idx_ok idx_scan | idx_ok | has_stats_reset
----------+-------- ----------+--------+-----------------
3 | t 3 | t | f
(1 row) (1 row)
-- check that the stats in pg_stat_all_indexes are reset -- check that the stats in pg_stat_all_indexes are reset
@@ -865,10 +874,11 @@ SELECT pg_stat_reset_single_table_counters('test_last_scan_pkey'::regclass);
(1 row) (1 row)
SELECT idx_scan FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass; SELECT idx_scan, stats_reset IS NOT NULL AS has_stats_reset
idx_scan FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass;
---------- idx_scan | has_stats_reset
0 ----------+-----------------
0 | t
(1 row) (1 row)
----- -----

View File

@@ -312,8 +312,11 @@ SELECT pg_stat_force_next_flush();
SELECT last_seq_scan, last_idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; SELECT last_seq_scan, last_idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
COMMIT; COMMIT;
SELECT stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass); SELECT pg_stat_reset_single_table_counters('test_last_scan'::regclass);
SELECT seq_scan, idx_scan FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; SELECT seq_scan, idx_scan, stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
-- ensure we start out with exactly one index and sequential scan -- ensure we start out with exactly one index and sequential scan
BEGIN; BEGIN;
@@ -383,13 +386,15 @@ SELECT seq_scan, :'test_last_seq' = last_seq_scan AS seq_ok, idx_scan, :'test_la
FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass; FROM pg_stat_all_tables WHERE relid = 'test_last_scan'::regclass;
-- check the stats in pg_stat_all_indexes -- check the stats in pg_stat_all_indexes
SELECT idx_scan, :'test_last_idx' < last_idx_scan AS idx_ok SELECT idx_scan, :'test_last_idx' < last_idx_scan AS idx_ok,
stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass; FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass;
-- check that the stats in pg_stat_all_indexes are reset -- check that the stats in pg_stat_all_indexes are reset
SELECT pg_stat_reset_single_table_counters('test_last_scan_pkey'::regclass); SELECT pg_stat_reset_single_table_counters('test_last_scan_pkey'::regclass);
SELECT idx_scan FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass; SELECT idx_scan, stats_reset IS NOT NULL AS has_stats_reset
FROM pg_stat_all_indexes WHERE indexrelid = 'test_last_scan_pkey'::regclass;
----- -----
-- Test reset of some stats for shared table -- Test reset of some stats for shared table