From 7da7413fad7c38c39b396789511f0e910a16608b Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Fri, 10 Jul 2026 14:53:50 +0900 Subject: [PATCH v13 3/3] Introduce relfilenode statistics Statistics data previously associated to relations are not moved under a new stats kind, for relfilenodes. This enables the reconstruction of the statistics after a system crash, as WAL replay is only able to know about the relfilenodes it works on. Shared catalogs are handled using their relmapping. A new set of fetch functions are used in the views, providing an equivalent of what existed previously. When a relation rewrite happens, the aggregated counters are not persisted, restarted at 0 as we start afresh. --- src/include/catalog/pg_proc.dat | 75 ++++--- src/include/pgstat.h | 39 +++- src/include/utils/pgstat_internal.h | 14 ++ src/include/utils/pgstat_kind.h | 15 +- src/backend/access/heap/heapam_xlog.c | 13 ++ src/backend/catalog/system_views.sql | 18 +- src/backend/postmaster/autovacuum.c | 40 ++-- src/backend/utils/activity/Makefile | 1 + src/backend/utils/activity/meson.build | 1 + src/backend/utils/activity/pgstat.c | 15 ++ src/backend/utils/activity/pgstat_relation.c | 190 +++++++++++------ .../utils/activity/pgstat_relfilenode.c | 179 ++++++++++++++++ src/backend/utils/adt/pgstatfuncs.c | 74 ++++--- src/test/isolation/expected/stats.out | 198 +++++++++--------- src/test/isolation/specs/stats.spec | 10 +- src/test/regress/expected/rules.out | 18 +- src/test/regress/expected/stats.out | 169 +++++++-------- src/test/regress/expected/stats_rewrite.out | 20 +- src/test/regress/expected/stats_rewrite_1.out | 8 +- src/test/regress/sql/stats.sql | 42 ++-- .../postgres_fdw/expected/postgres_fdw.out | 20 +- contrib/postgres_fdw/sql/postgres_fdw.sql | 8 +- 22 files changed, 751 insertions(+), 416 deletions(-) create mode 100644 src/backend/utils/activity/pgstat_relfilenode.c diff --git a/src/include/catalog/pg_proc.dat b/src/include/catalog/pg_proc.dat index dc6c61e84e54..acb8b9a4d588 100644 --- a/src/include/catalog/pg_proc.dat +++ b/src/include/catalog/pg_proc.dat @@ -5578,45 +5578,6 @@ proname => 'pg_stat_get_tuples_fetched', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', prosrc => 'pg_stat_get_tuples_fetched' }, -{ oid => '1931', descr => 'statistics: number of tuples inserted', - proname => 'pg_stat_get_tuples_inserted', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_tuples_inserted' }, -{ oid => '1932', descr => 'statistics: number of tuples updated', - proname => 'pg_stat_get_tuples_updated', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_tuples_updated' }, -{ oid => '1933', descr => 'statistics: number of tuples deleted', - proname => 'pg_stat_get_tuples_deleted', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_tuples_deleted' }, -{ oid => '1972', descr => 'statistics: number of tuples hot updated', - proname => 'pg_stat_get_tuples_hot_updated', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_tuples_hot_updated' }, -{ oid => '6217', - descr => 'statistics: number of tuples updated onto a new page', - proname => 'pg_stat_get_tuples_newpage_updated', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_tuples_newpage_updated' }, -{ oid => '2878', descr => 'statistics: number of live tuples', - proname => 'pg_stat_get_live_tuples', provolatile => 's', proparallel => 'r', - prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_live_tuples' }, -{ oid => '2879', descr => 'statistics: number of dead tuples', - proname => 'pg_stat_get_dead_tuples', provolatile => 's', proparallel => 'r', - prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_dead_tuples' }, -{ oid => '3177', - descr => 'statistics: number of tuples changed since last analyze', - proname => 'pg_stat_get_mod_since_analyze', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_mod_since_analyze' }, -{ oid => '5053', - descr => 'statistics: number of tuples inserted since last vacuum', - proname => 'pg_stat_get_ins_since_vacuum', provolatile => 's', - proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', - prosrc => 'pg_stat_get_ins_since_vacuum' }, { oid => '1934', descr => 'statistics: number of blocks fetched', proname => 'pg_stat_get_blocks_fetched', provolatile => 's', proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', @@ -6294,6 +6255,42 @@ proname => 'pg_stat_get_xact_idx_blocks_hit', provolatile => 'v', proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', prosrc => 'pg_stat_get_xact_idx_blocks_hit' }, +{ oid => '9055', descr => 'statistics: number of tuples inserted (by relfilenode)', + proname => 'pg_stat_get_rfn_tuples_inserted', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_tuples_inserted' }, +{ oid => '9056', descr => 'statistics: number of tuples updated (by relfilenode)', + proname => 'pg_stat_get_rfn_tuples_updated', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_tuples_updated' }, +{ oid => '9057', descr => 'statistics: number of tuples deleted (by relfilenode)', + proname => 'pg_stat_get_rfn_tuples_deleted', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_tuples_deleted' }, +{ oid => '9058', descr => 'statistics: number of tuples HOT updated (by relfilenode)', + proname => 'pg_stat_get_rfn_tuples_hot_updated', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_tuples_hot_updated' }, +{ oid => '9059', descr => 'statistics: number of tuples updated to new page (by relfilenode)', + proname => 'pg_stat_get_rfn_tuples_newpage_updated', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_tuples_newpage_updated' }, +{ oid => '9060', descr => 'statistics: number of live tuples (by relfilenode)', + proname => 'pg_stat_get_rfn_live_tuples', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_live_tuples' }, +{ oid => '9061', descr => 'statistics: number of dead tuples (by relfilenode)', + proname => 'pg_stat_get_rfn_dead_tuples', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_dead_tuples' }, +{ oid => '9062', descr => 'statistics: number of tuples changed since last analyze (by relfilenode)', + proname => 'pg_stat_get_rfn_mod_since_analyze', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_mod_since_analyze' }, +{ oid => '9063', descr => 'statistics: number of tuples inserted since last vacuum (by relfilenode)', + proname => 'pg_stat_get_rfn_ins_since_vacuum', provolatile => 's', + proparallel => 'r', prorettype => 'int8', proargtypes => 'oid', + prosrc => 'pg_stat_get_rfn_ins_since_vacuum' }, { oid => '3777', descr => 'statistics: reset collected statistics for a single function in the current database', proname => 'pg_stat_reset_single_function_counters', provolatile => 'v', diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 892cdf24139b..f2094270a000 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -12,6 +12,7 @@ #define PGSTAT_H #include "datatype/timestamp.h" +#include "common/relpath.h" #include "portability/instr_time.h" #include "postmaster/pgarch.h" /* for MAX_XFN_CHARS */ #include "replication/conflict.h" @@ -210,6 +211,7 @@ typedef struct PgStat_RelationStatus { Oid id; /* table's OID */ bool shared; /* is it a shared catalog? */ + RelFileNumber relfilenode; /* table's relfilenode */ struct PgStat_RelXactStatus *trans; /* lowest subxact's counts */ PgStat_TableCounts counts; /* event counts to be sent */ } tab; @@ -489,17 +491,6 @@ typedef struct PgStat_StatTabEntry PgStat_Counter tuples_returned; PgStat_Counter tuples_fetched; - PgStat_Counter tuples_inserted; - PgStat_Counter tuples_updated; - PgStat_Counter tuples_deleted; - PgStat_Counter tuples_hot_updated; - PgStat_Counter tuples_newpage_updated; - - PgStat_Counter live_tuples; - PgStat_Counter dead_tuples; - PgStat_Counter mod_since_analyze; - PgStat_Counter ins_since_vacuum; - PgStat_Counter blocks_fetched; PgStat_Counter blocks_hit; @@ -534,6 +525,22 @@ typedef struct PgStat_StatIdxEntry TimestampTz stat_reset_time; } PgStat_StatIdxEntry; +typedef struct PgStat_StatRFNodeEntry +{ + PgStat_Counter tuples_inserted; + PgStat_Counter tuples_updated; + PgStat_Counter tuples_deleted; + PgStat_Counter tuples_hot_updated; + PgStat_Counter tuples_newpage_updated; + + PgStat_Counter live_tuples; + PgStat_Counter dead_tuples; + PgStat_Counter mod_since_analyze; + PgStat_Counter ins_since_vacuum; + + TimestampTz stat_reset_time; +} PgStat_StatRFNodeEntry; + /* ------ * PgStat_WalCounters WAL activity data gathered from WalUsage * @@ -848,6 +855,16 @@ extern PgStat_StatIdxEntry *pgstat_fetch_stat_idxentry_ext(bool shared, Oid reloid, bool *may_free); +extern PgStat_StatRFNodeEntry *pgstat_fetch_stat_rfnodeentry(Oid dboid, + RelFileNumber rfn); + +/* WAL replay helpers for relfilenode stats */ +extern void pgstat_wal_replay_insert(Oid dboid, RelFileNumber relfilenode, + int ntuples); +extern void pgstat_wal_replay_update(Oid dboid, RelFileNumber relfilenode, + bool hot, bool newpage); +extern void pgstat_wal_replay_delete(Oid dboid, RelFileNumber relfilenode); + /* * Functions in pgstat_replslot.c diff --git a/src/include/utils/pgstat_internal.h b/src/include/utils/pgstat_internal.h index 4df3082f2b6e..466b3e79e5bd 100644 --- a/src/include/utils/pgstat_internal.h +++ b/src/include/utils/pgstat_internal.h @@ -513,6 +513,12 @@ typedef struct PgStatShared_Index PgStat_StatIdxEntry stats; } PgStatShared_Index; +typedef struct PgStatShared_RelFileNode +{ + PgStatShared_Common header; + PgStat_StatRFNodeEntry stats; +} PgStatShared_RelFileNode; + typedef struct PgStatShared_Function { PgStatShared_Common header; @@ -802,6 +808,14 @@ extern void pgstat_index_delete_pending_cb(PgStat_EntryRef *entry_ref); extern void pgstat_index_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts); +/* + * Functions in pgstat_relfilenode.c + */ + +extern bool pgstat_relfilenode_flush_cb(PgStat_EntryRef *entry_ref, bool nowait); +extern void pgstat_relfilenode_reset_timestamp_cb(PgStatShared_Common *header, TimestampTz ts); + + /* * Functions in pgstat_replslot.c */ diff --git a/src/include/utils/pgstat_kind.h b/src/include/utils/pgstat_kind.h index 45ca599d0dd6..84ccaa068489 100644 --- a/src/include/utils/pgstat_kind.h +++ b/src/include/utils/pgstat_kind.h @@ -31,15 +31,16 @@ #define PGSTAT_KIND_REPLSLOT 5 /* per-slot statistics */ #define PGSTAT_KIND_SUBSCRIPTION 6 /* per-subscription statistics */ #define PGSTAT_KIND_BACKEND 7 /* per-backend statistics */ +#define PGSTAT_KIND_RELFILENODE 8 /* per-relfilenode statistics */ /* stats for fixed-numbered objects */ -#define PGSTAT_KIND_ARCHIVER 8 -#define PGSTAT_KIND_BGWRITER 9 -#define PGSTAT_KIND_CHECKPOINTER 10 -#define PGSTAT_KIND_IO 11 -#define PGSTAT_KIND_LOCK 12 -#define PGSTAT_KIND_SLRU 13 -#define PGSTAT_KIND_WAL 14 +#define PGSTAT_KIND_ARCHIVER 9 +#define PGSTAT_KIND_BGWRITER 10 +#define PGSTAT_KIND_CHECKPOINTER 11 +#define PGSTAT_KIND_IO 12 +#define PGSTAT_KIND_LOCK 13 +#define PGSTAT_KIND_SLRU 14 +#define PGSTAT_KIND_WAL 15 #define PGSTAT_KIND_BUILTIN_MIN PGSTAT_KIND_DATABASE #define PGSTAT_KIND_BUILTIN_MAX PGSTAT_KIND_WAL diff --git a/src/backend/access/heap/heapam_xlog.c b/src/backend/access/heap/heapam_xlog.c index 9ed7024e8147..f1379c699900 100644 --- a/src/backend/access/heap/heapam_xlog.c +++ b/src/backend/access/heap/heapam_xlog.c @@ -19,6 +19,7 @@ #include "access/visibilitymap.h" #include "access/xlog.h" #include "access/xlogutils.h" +#include "pgstat.h" #include "storage/freespace.h" #include "storage/standby.h" @@ -357,6 +358,9 @@ heap_xlog_delete(XLogReaderState *record) } if (BufferIsValid(buffer)) UnlockReleaseBuffer(buffer); + + pgstat_wal_replay_delete(target_locator.dbOid, + target_locator.relNumber); } /* @@ -483,6 +487,9 @@ heap_xlog_insert(XLogReaderState *record) */ if (action == BLK_NEEDS_REDO && freespace < BLCKSZ / 5) XLogRecordPageWithFreeSpace(target_locator, blkno, freespace); + + pgstat_wal_replay_insert(target_locator.dbOid, + target_locator.relNumber, 1); } /* @@ -688,6 +695,9 @@ heap_xlog_multi_insert(XLogReaderState *record) */ if (action == BLK_NEEDS_REDO && freespace < BLCKSZ / 5) XLogRecordPageWithFreeSpace(rlocator, blkno, freespace); + + pgstat_wal_replay_insert(rlocator.dbOid, rlocator.relNumber, + xlrec->ntuples); } /* @@ -967,6 +977,9 @@ heap_xlog_update(XLogReaderState *record, bool hot_update) */ if (newaction == BLK_NEEDS_REDO && !hot_update && freespace < BLCKSZ / 5) XLogRecordPageWithFreeSpace(rlocator, newblk, freespace); + + pgstat_wal_replay_update(rlocator.dbOid, rlocator.relNumber, + hot_update, (oldblk != newblk && !hot_update)); } /* diff --git a/src/backend/catalog/system_views.sql b/src/backend/catalog/system_views.sql index ce991e4269e7..2577fe608f23 100644 --- a/src/backend/catalog/system_views.sql +++ b/src/backend/catalog/system_views.sql @@ -726,15 +726,15 @@ CREATE VIEW pg_stat_all_tables AS max(pg_stat_get_idx_lastscan(I.indexrelid)) AS last_idx_scan, sum(pg_stat_get_idx_tuples_fetched(I.indexrelid))::bigint + pg_stat_get_tuples_fetched(C.oid) AS idx_tup_fetch, - pg_stat_get_tuples_inserted(C.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(C.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(C.oid) AS n_tup_del, - pg_stat_get_tuples_hot_updated(C.oid) AS n_tup_hot_upd, - pg_stat_get_tuples_newpage_updated(C.oid) AS n_tup_newpage_upd, - pg_stat_get_live_tuples(C.oid) AS n_live_tup, - pg_stat_get_dead_tuples(C.oid) AS n_dead_tup, - pg_stat_get_mod_since_analyze(C.oid) AS n_mod_since_analyze, - pg_stat_get_ins_since_vacuum(C.oid) AS n_ins_since_vacuum, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(C.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(C.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(C.oid)) AS n_tup_del, + pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode(C.oid)) AS n_tup_hot_upd, + pg_stat_get_rfn_tuples_newpage_updated(pg_relation_filenode(C.oid)) AS n_tup_newpage_upd, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(C.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(C.oid)) AS n_dead_tup, + pg_stat_get_rfn_mod_since_analyze(pg_relation_filenode(C.oid)) AS n_mod_since_analyze, + pg_stat_get_rfn_ins_since_vacuum(pg_relation_filenode(C.oid)) AS n_ins_since_vacuum, pg_stat_get_last_vacuum_time(C.oid) as last_vacuum, pg_stat_get_last_autovacuum_time(C.oid) as last_autovacuum, pg_stat_get_last_analyze_time(C.oid) as last_analyze, diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 45abf48768af..23e4637968f8 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -109,6 +109,7 @@ #include "utils/memutils.h" #include "utils/ps_status.h" #include "utils/rel.h" +#include "utils/relmapper.h" #include "utils/snapmgr.h" #include "utils/syscache.h" #include "utils/timeout.h" @@ -3082,10 +3083,10 @@ relation_needs_vacanalyze(Oid relid, bool *wraparound, AutoVacuumScores *scores) { - PgStat_StatTabEntry *tabentry; + PgStat_StatRFNodeEntry *rfnentry; + RelFileNumber rfn; bool force_vacuum; bool av_enabled; - bool may_free = false; /* constants from reloptions or GUC variables */ int vac_base_thresh, @@ -3247,20 +3248,27 @@ relation_needs_vacanalyze(Oid relid, *dovacuum = true; /* - * If we found stats for the table, and autovacuum is currently enabled, - * make a threshold-based decision whether to vacuum and/or analyze. If - * autovacuum is currently disabled, we must be here for anti-wraparound - * vacuuming only, so don't vacuum (or analyze) anything that's not being - * forced. + * Fetch tuple counters from the relfilenode entry. For shared catalogs, + * use the relation map. */ - tabentry = pgstat_fetch_stat_tabentry_ext(classForm->relisshared, - relid, &may_free); - if (!tabentry) - return; + rfn = classForm->relfilenode; + if (!RelFileNumberIsValid(rfn)) + rfn = RelationMapOidToFilenumber(relid, classForm->relisshared); - vactuples = tabentry->dead_tuples; - instuples = tabentry->ins_since_vacuum; - anltuples = tabentry->mod_since_analyze; + rfnentry = pgstat_fetch_stat_rfnodeentry( + classForm->relisshared ? InvalidOid : MyDatabaseId, rfn); + if (rfnentry) + { + vactuples = rfnentry->dead_tuples; + instuples = rfnentry->ins_since_vacuum; + anltuples = rfnentry->mod_since_analyze; + } + else + { + vactuples = 0; + instuples = 0; + anltuples = 0; + } /* If the table hasn't yet been vacuumed, take reltuples as zero */ if (reltuples < 0) @@ -3334,10 +3342,6 @@ relation_needs_vacanalyze(Oid relid, vactuples, vacthresh, scores->vac, anltuples, anlthresh, scores->anl, scores->xid, scores->mxid); - - /* Avoid leaking pgstat entries until the end of autovacuum. */ - if (may_free) - pfree(tabentry); } /* diff --git a/src/backend/utils/activity/Makefile b/src/backend/utils/activity/Makefile index 2e32d1485d64..7ee4c82e1b65 100644 --- a/src/backend/utils/activity/Makefile +++ b/src/backend/utils/activity/Makefile @@ -30,6 +30,7 @@ OBJS = \ pgstat_kind.o \ pgstat_lock.o \ pgstat_relation.o \ + pgstat_relfilenode.o \ pgstat_replslot.o \ pgstat_shmem.o \ pgstat_slru.o \ diff --git a/src/backend/utils/activity/meson.build b/src/backend/utils/activity/meson.build index e6dcb2e26fc5..754e120dd612 100644 --- a/src/backend/utils/activity/meson.build +++ b/src/backend/utils/activity/meson.build @@ -15,6 +15,7 @@ backend_sources += files( 'pgstat_kind.c', 'pgstat_lock.c', 'pgstat_relation.c', + 'pgstat_relfilenode.c', 'pgstat_replslot.c', 'pgstat_shmem.c', 'pgstat_slru.c', diff --git a/src/backend/utils/activity/pgstat.c b/src/backend/utils/activity/pgstat.c index 907d1f53a7ec..e545b1c7aaac 100644 --- a/src/backend/utils/activity/pgstat.c +++ b/src/backend/utils/activity/pgstat.c @@ -333,6 +333,21 @@ static const PgStat_KindInfo pgstat_kind_builtin_infos[PGSTAT_KIND_BUILTIN_SIZE] .reset_timestamp_cb = pgstat_index_reset_timestamp_cb, }, + [PGSTAT_KIND_RELFILENODE] = { + .name = "relfilenode", + + .fixed_amount = false, + .write_to_file = true, + + .shared_size = sizeof(PgStatShared_RelFileNode), + .shared_data_off = offsetof(PgStatShared_RelFileNode, stats), + .shared_data_len = sizeof(((PgStatShared_RelFileNode *) 0)->stats), + .pending_size = sizeof(PgStat_RelationStatus), + + .flush_pending_cb = pgstat_relfilenode_flush_cb, + .reset_timestamp_cb = pgstat_relfilenode_reset_timestamp_cb, + }, + [PGSTAT_KIND_FUNCTION] = { .name = "function", diff --git a/src/backend/utils/activity/pgstat_relation.c b/src/backend/utils/activity/pgstat_relation.c index 0cfa5be49cde..7dbcc22fa78f 100644 --- a/src/backend/utils/activity/pgstat_relation.c +++ b/src/backend/utils/activity/pgstat_relation.c @@ -37,6 +37,7 @@ typedef struct TwoPhasePgStatRecord PgStat_Counter updated_pre_truncdrop; PgStat_Counter deleted_pre_truncdrop; Oid id; /* table's OID */ + RelFileNumber relfilenode; /* table's relfilenode at prepare time */ bool shared; /* is it a shared catalog? */ bool truncdropped; /* was the relation truncated/dropped? */ } TwoPhasePgStatRecord; @@ -182,6 +183,13 @@ pgstat_assoc_relation(Relation rel) RelationGetRelid(rel), rel->rd_rel->relisshared); + /* Store relfilenode for PGSTAT_KIND_RELFILENODE flush */ + if (rel->rd_rel->relkind != RELKIND_PARTITIONED_TABLE && + rel->rd_rel->relkind != RELKIND_INDEX) + rel->pgstat_info->tab.relfilenode = rel->rd_locator.relNumber; + else + rel->pgstat_info->tab.relfilenode = InvalidRelFileNumber; + /* don't allow link a stats to multiple relcache entries */ Assert(rel->pgstat_info->relation == NULL); @@ -264,8 +272,11 @@ pgstat_report_vacuum(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, TimestampTz starttime) { PgStat_EntryRef *entry_ref; + PgStat_EntryRef *rfn_ref; PgStatShared_Relation *shtabentry; + PgStatShared_RelFileNode *shrfnstats; PgStat_StatTabEntry *tabentry; + PgStat_StatRFNodeEntry *rfnentry; Oid dboid = (rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId); TimestampTz ts; PgStat_Counter elapsedtime; @@ -284,21 +295,6 @@ pgstat_report_vacuum(Relation rel, PgStat_Counter livetuples, shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats; tabentry = &shtabentry->stats; - tabentry->live_tuples = livetuples; - tabentry->dead_tuples = deadtuples; - - /* - * It is quite possible that a non-aggressive VACUUM ended up skipping - * various pages, however, we'll zero the insert counter here regardless. - * It's currently used only to track when we need to perform an "insert" - * autovacuum, which are mainly intended to freeze newly inserted tuples. - * Zeroing this may just mean we'll not try to vacuum the table again - * until enough tuples have been inserted to trigger another insert - * autovacuum. An anti-wraparound autovacuum will catch any persistent - * stragglers. - */ - tabentry->ins_since_vacuum = 0; - if (AmAutoVacuumWorkerProcess()) { tabentry->last_autovacuum_time = ts; @@ -314,6 +310,34 @@ pgstat_report_vacuum(Relation rel, PgStat_Counter livetuples, pgstat_unlock_entry(entry_ref); + /* Update the relfilenode entry */ + rfn_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, + (uint64) rel->rd_locator.relNumber, + false); + if (rfn_ref) + { + shrfnstats = (PgStatShared_RelFileNode *) rfn_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->live_tuples = livetuples; + rfnentry->dead_tuples = deadtuples; + + /* + * It is quite possible that a non-aggressive VACUUM ended up + * skipping various pages, however, we'll zero the insert counter + * here regardless. It's currently used only to track when we need + * to perform an "insert" autovacuum, which are mainly intended to + * freeze newly inserted tuples. Zeroing this may just mean we'll + * not try to vacuum the table again until enough tuples have been + * inserted to trigger another insert autovacuum. An + * anti-wraparound autovacuum will catch any persistent stragglers. + */ + rfnentry->ins_since_vacuum = 0; + + pgstat_unlock_entry(rfn_ref); + } + /* * Flush IO statistics now. pgstat_report_stat() will flush IO stats, * however this will not be called until after an entire autovacuum cycle @@ -336,8 +360,11 @@ pgstat_report_analyze(Relation rel, bool resetcounter, TimestampTz starttime) { PgStat_EntryRef *entry_ref; + PgStat_EntryRef *rfn_ref; PgStatShared_Relation *shtabentry; + PgStatShared_RelFileNode *shrfnstats; PgStat_StatTabEntry *tabentry; + PgStat_StatRFNodeEntry *rfnentry; Oid dboid = (rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId); TimestampTz ts; PgStat_Counter elapsedtime; @@ -388,17 +415,6 @@ pgstat_report_analyze(Relation rel, shtabentry = (PgStatShared_Relation *) entry_ref->shared_stats; tabentry = &shtabentry->stats; - tabentry->live_tuples = livetuples; - tabentry->dead_tuples = deadtuples; - - /* - * If commanded, reset mod_since_analyze to zero. This forgets any - * changes that were committed while the ANALYZE was in progress, but we - * have no good way to estimate how many of those there were. - */ - if (resetcounter) - tabentry->mod_since_analyze = 0; - if (AmAutoVacuumWorkerProcess()) { tabentry->last_autoanalyze_time = ts; @@ -414,6 +430,30 @@ pgstat_report_analyze(Relation rel, pgstat_unlock_entry(entry_ref); + /* Update the relfilenode entry */ + rfn_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, + (uint64) rel->rd_locator.relNumber, + false); + if (rfn_ref) + { + shrfnstats = (PgStatShared_RelFileNode *) rfn_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->live_tuples = livetuples; + rfnentry->dead_tuples = deadtuples; + + /* + * If commanded, reset mod_since_analyze to zero. This forgets any + * changes that were committed while the ANALYZE was in progress, but + * we have no good way to estimate how many of those there were. + */ + if (resetcounter) + rfnentry->mod_since_analyze = 0; + + pgstat_unlock_entry(rfn_ref); + } + /* see pgstat_report_vacuum() */ pgstat_flush_io(false); (void) pgstat_flush_backend(false, PGSTAT_BACKEND_FLUSH_IO); @@ -767,6 +807,7 @@ AtPrepare_PgStat_Relations(PgStat_SubXactStatus *xact_state) record.updated_pre_truncdrop = trans->updated_pre_truncdrop; record.deleted_pre_truncdrop = trans->deleted_pre_truncdrop; record.id = tabstat->tab.id; + record.relfilenode = tabstat->tab.relfilenode; record.shared = tabstat->tab.shared; record.truncdropped = trans->truncdropped; @@ -811,6 +852,7 @@ pgstat_twophase_postcommit(FullTransactionId fxid, uint16 info, /* Find or create a tabstat entry for the rel */ pgstat_info = pgstat_prep_relation_pending(PGSTAT_KIND_RELATION, rec->id, rec->shared); + pgstat_info->tab.relfilenode = rec->relfilenode; /* Same math as in AtEOXact_PgStat, commit case */ pgstat_info->tab.counts.tuples_inserted += rec->tuples_inserted; @@ -847,6 +889,7 @@ pgstat_twophase_postabort(FullTransactionId fxid, uint16 info, /* Find or create a tabstat entry for the rel */ pgstat_info = pgstat_prep_relation_pending(PGSTAT_KIND_RELATION, rec->id, rec->shared); + pgstat_info->tab.relfilenode = rec->relfilenode; /* Same math as in AtEOXact_PgStat, abort case */ if (rec->truncdropped) @@ -875,10 +918,14 @@ bool pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) { Oid dboid; + RelFileNumber rfn; PgStat_RelationStatus *lstats; /* pending stats entry */ PgStatShared_Relation *shtabstats; PgStat_StatTabEntry *tabentry; /* table entry of shared stats */ PgStat_StatDBEntry *dbentry; /* pending database entry */ + PgStat_EntryRef *rfn_ref; + PgStatShared_RelFileNode *shrfnstats; + PgStat_StatRFNodeEntry *rfnentry; dboid = entry_ref->shared_entry->key.dboid; lstats = (PgStat_RelationStatus *) entry_ref->pending; @@ -908,45 +955,70 @@ pgstat_relation_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) } tabentry->tuples_returned += lstats->tab.counts.tuples_returned; tabentry->tuples_fetched += lstats->tab.counts.tuples_fetched; - tabentry->tuples_inserted += lstats->tab.counts.tuples_inserted; - tabentry->tuples_updated += lstats->tab.counts.tuples_updated; - tabentry->tuples_deleted += lstats->tab.counts.tuples_deleted; - tabentry->tuples_hot_updated += lstats->tab.counts.tuples_hot_updated; - tabentry->tuples_newpage_updated += lstats->tab.counts.tuples_newpage_updated; - - /* - * If table was truncated/dropped, first reset the live/dead counters. - */ - if (lstats->tab.counts.truncdropped) - { - tabentry->live_tuples = 0; - tabentry->dead_tuples = 0; - tabentry->ins_since_vacuum = 0; - } - - tabentry->live_tuples += lstats->tab.counts.delta_live_tuples; - tabentry->dead_tuples += lstats->tab.counts.delta_dead_tuples; - tabentry->mod_since_analyze += lstats->tab.counts.changed_tuples; - - /* - * Using tuples_inserted to update ins_since_vacuum does mean that we'll - * track aborted inserts too. This isn't ideal, but otherwise probably - * not worth adding an extra field for. It may just amount to autovacuums - * triggering for inserts more often than they maybe should, which is - * probably not going to be common enough to be too concerned about here. - */ - tabentry->ins_since_vacuum += lstats->tab.counts.tuples_inserted; tabentry->blocks_fetched += lstats->tab.counts.blocks_fetched; tabentry->blocks_hit += lstats->tab.counts.blocks_hit; - /* Clamp live_tuples in case of negative delta_live_tuples */ - tabentry->live_tuples = Max(tabentry->live_tuples, 0); - /* Likewise for dead_tuples */ - tabentry->dead_tuples = Max(tabentry->dead_tuples, 0); - pgstat_unlock_entry(entry_ref); + /* + * Flush tuple counters to the relfilenode entry. + * + * Use the current relfilenode from the relation (if available) since it + * may have changed due to TRUNCATE. Fall back to the cached value. + */ + rfn = InvalidRelFileNumber; + + if (lstats->relation) + rfn = lstats->relation->rd_locator.relNumber; + else if (lstats->tab.relfilenode != InvalidRelFileNumber) + rfn = lstats->tab.relfilenode; + + if (rfn != InvalidRelFileNumber) + { + rfn_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, + (uint64) rfn, + nowait); + if (rfn_ref) + { + shrfnstats = (PgStatShared_RelFileNode *) rfn_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->tuples_inserted += lstats->tab.counts.tuples_inserted; + rfnentry->tuples_updated += lstats->tab.counts.tuples_updated; + rfnentry->tuples_deleted += lstats->tab.counts.tuples_deleted; + rfnentry->tuples_hot_updated += lstats->tab.counts.tuples_hot_updated; + rfnentry->tuples_newpage_updated += lstats->tab.counts.tuples_newpage_updated; + + if (lstats->tab.counts.truncdropped) + { + rfnentry->live_tuples = 0; + rfnentry->dead_tuples = 0; + rfnentry->ins_since_vacuum = 0; + } + + rfnentry->live_tuples += lstats->tab.counts.delta_live_tuples; + rfnentry->dead_tuples += lstats->tab.counts.delta_dead_tuples; + rfnentry->mod_since_analyze += lstats->tab.counts.changed_tuples; + + /* + * Using tuples_inserted to update ins_since_vacuum means we + * track aborted inserts too. This isn't ideal, but not worth + * adding an extra field for — it may just trigger autovacuums + * slightly more often than necessary. + */ + rfnentry->ins_since_vacuum += lstats->tab.counts.tuples_inserted; + + /* Clamp live_tuples in case of negative delta_live_tuples */ + rfnentry->live_tuples = Max(rfnentry->live_tuples, 0); + /* Likewise for dead_tuples */ + rfnentry->dead_tuples = Max(rfnentry->dead_tuples, 0); + + pgstat_unlock_entry(rfn_ref); + } + } + /* The entry was successfully flushed, add the same to database stats */ dbentry = pgstat_prep_database_pending(dboid); dbentry->tuples_returned += lstats->tab.counts.tuples_returned; diff --git a/src/backend/utils/activity/pgstat_relfilenode.c b/src/backend/utils/activity/pgstat_relfilenode.c new file mode 100644 index 000000000000..82613fb1a4ee --- /dev/null +++ b/src/backend/utils/activity/pgstat_relfilenode.c @@ -0,0 +1,179 @@ +/* ------------------------------------------------------------------------- + * + * pgstat_relfilenode.c + * Implementation of per-relfilenode statistics. + * + * This file contains the implementation of PGSTAT_KIND_RELFILENODE statistics, + * for tuple counters (inserts, updates, deletes, live/dead tuples, etc.) keyed + * by relfilenode. These counters are rebuilt during crash recovery, from WAL + * replayed. + * + * Copyright (c) 2001-2026, PostgreSQL Global Development Group + * + * IDENTIFICATION + * src/backend/utils/activity/pgstat_relfilenode.c + * ------------------------------------------------------------------------- + */ + +#include "postgres.h" + +#include "utils/memutils.h" +#include "utils/pgstat_internal.h" + + +/* + * Flush out pending stats for a relfilenode entry. + * + * If nowait is true and the lock could not be immediately acquired, returns + * false without flushing the entry. Otherwise returns true. + */ +bool +pgstat_relfilenode_flush_cb(PgStat_EntryRef *entry_ref, bool nowait) +{ + PgStat_RelationStatus *lstats; /* pending stats entry */ + PgStatShared_RelFileNode *shrfnstats; + PgStat_StatRFNodeEntry *rfnentry; + + lstats = (PgStat_RelationStatus *) entry_ref->pending; + shrfnstats = (PgStatShared_RelFileNode *) entry_ref->shared_stats; + + /* + * Ignore entries that didn't accumulate any actual counts, such as + * tables that were opened but not modified. + */ + if (pg_memory_is_all_zeros(&lstats->tab.counts, + sizeof(struct PgStat_TableCounts))) + return true; + + if (!pgstat_lock_entry(entry_ref, nowait)) + return false; + + /* Add the values to the shared entry. */ + rfnentry = &shrfnstats->stats; + + /* + * If table was truncated/dropped, first reset the live/dead counters. + */ + if (lstats->tab.counts.truncdropped) + { + rfnentry->live_tuples = 0; + rfnentry->dead_tuples = 0; + rfnentry->ins_since_vacuum = 0; + } + + rfnentry->live_tuples += lstats->tab.counts.delta_live_tuples; + rfnentry->dead_tuples += lstats->tab.counts.delta_dead_tuples; + rfnentry->mod_since_analyze += lstats->tab.counts.changed_tuples; + + /* + * Using tuples_inserted to update ins_since_vacuum means we track + * aborted inserts too. This isn't ideal, but not worth adding an extra + * field for — it may just trigger autovacuums slightly more often than + * necessary. + */ + rfnentry->ins_since_vacuum += lstats->tab.counts.tuples_inserted; + + /* Clamp live_tuples in case of negative delta_live_tuples */ + rfnentry->live_tuples = Max(rfnentry->live_tuples, 0); + /* Likewise for dead_tuples */ + rfnentry->dead_tuples = Max(rfnentry->dead_tuples, 0); + + pgstat_unlock_entry(entry_ref); + + return true; +} + +/* + * Callback to reset the timestamp on a relfilenode stats entry. + */ +void +pgstat_relfilenode_reset_timestamp_cb(PgStatShared_Common *header, + TimestampTz ts) +{ + ((PgStatShared_RelFileNode *) header)->stats.stat_reset_time = ts; +} + +/* + * Fetch the relfilenode stats entry for the given database and relfilenode. + */ +PgStat_StatRFNodeEntry * +pgstat_fetch_stat_rfnodeentry(Oid dboid, RelFileNumber rfn) +{ + return (PgStat_StatRFNodeEntry *) + pgstat_fetch_entry(PGSTAT_KIND_RELFILENODE, dboid, (uint64) rfn, NULL); +} + +/* + * WAL replay: increment tuple counters in the relfilenode entry. + * + * This is called during WAL replay to rebuild tuple counters from + * heap WAL records. It directly updates the shared stats entry without + * going through the pending/flush machinery. + */ +void +pgstat_wal_replay_insert(Oid dboid, RelFileNumber relfilenode, int ntuples) +{ + PgStat_EntryRef *entry_ref; + PgStatShared_RelFileNode *shrfnstats; + PgStat_StatRFNodeEntry *rfnentry; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, (uint64) relfilenode, + false); + shrfnstats = (PgStatShared_RelFileNode *) entry_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->tuples_inserted += ntuples; + rfnentry->mod_since_analyze += ntuples; + rfnentry->ins_since_vacuum += ntuples; + rfnentry->live_tuples += ntuples; + + pgstat_unlock_entry(entry_ref); +} + +void +pgstat_wal_replay_update(Oid dboid, RelFileNumber relfilenode, + bool hot, bool newpage) +{ + PgStat_EntryRef *entry_ref; + PgStatShared_RelFileNode *shrfnstats; + PgStat_StatRFNodeEntry *rfnentry; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, (uint64) relfilenode, + false); + shrfnstats = (PgStatShared_RelFileNode *) entry_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->tuples_updated++; + rfnentry->mod_since_analyze++; + rfnentry->dead_tuples++; + if (hot) + rfnentry->tuples_hot_updated++; + if (newpage) + rfnentry->tuples_newpage_updated++; + + pgstat_unlock_entry(entry_ref); +} + +void +pgstat_wal_replay_delete(Oid dboid, RelFileNumber relfilenode) +{ + PgStat_EntryRef *entry_ref; + PgStatShared_RelFileNode *shrfnstats; + PgStat_StatRFNodeEntry *rfnentry; + + entry_ref = pgstat_get_entry_ref_locked(PGSTAT_KIND_RELFILENODE, + dboid, (uint64) relfilenode, + false); + shrfnstats = (PgStatShared_RelFileNode *) entry_ref->shared_stats; + rfnentry = &shrfnstats->stats; + + rfnentry->tuples_deleted++; + rfnentry->mod_since_analyze++; + rfnentry->dead_tuples++; + rfnentry->live_tuples--; + rfnentry->live_tuples = Max(rfnentry->live_tuples, 0); + + pgstat_unlock_entry(entry_ref); +} diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c index 0d47d745c18f..8be2cb4d1293 100644 --- a/src/backend/utils/adt/pgstatfuncs.c +++ b/src/backend/utils/adt/pgstatfuncs.c @@ -69,45 +69,65 @@ PG_STAT_GET_RELENTRY_INT64(blocks_fetched) /* pg_stat_get_blocks_hit */ PG_STAT_GET_RELENTRY_INT64(blocks_hit) -/* pg_stat_get_dead_tuples */ -PG_STAT_GET_RELENTRY_INT64(dead_tuples) - -/* pg_stat_get_ins_since_vacuum */ -PG_STAT_GET_RELENTRY_INT64(ins_since_vacuum) - -/* pg_stat_get_live_tuples */ -PG_STAT_GET_RELENTRY_INT64(live_tuples) - -/* pg_stat_get_mod_since_analyze */ -PG_STAT_GET_RELENTRY_INT64(mod_since_analyze) - /* pg_stat_get_numscans */ PG_STAT_GET_RELENTRY_INT64(numscans) -/* pg_stat_get_tuples_deleted */ -PG_STAT_GET_RELENTRY_INT64(tuples_deleted) - /* pg_stat_get_tuples_fetched */ PG_STAT_GET_RELENTRY_INT64(tuples_fetched) -/* pg_stat_get_tuples_hot_updated */ -PG_STAT_GET_RELENTRY_INT64(tuples_hot_updated) - -/* pg_stat_get_tuples_newpage_updated */ -PG_STAT_GET_RELENTRY_INT64(tuples_newpage_updated) - -/* pg_stat_get_tuples_inserted */ -PG_STAT_GET_RELENTRY_INT64(tuples_inserted) - /* pg_stat_get_tuples_returned */ PG_STAT_GET_RELENTRY_INT64(tuples_returned) -/* pg_stat_get_tuples_updated */ -PG_STAT_GET_RELENTRY_INT64(tuples_updated) - /* pg_stat_get_vacuum_count */ PG_STAT_GET_RELENTRY_INT64(vacuum_count) +/* + * Accessor macro for relfilenode stats entries (PgStat_StatRFNodeEntry). + * Takes a relfilenode number as input (from pg_class.relfilenode). + */ +#define PG_STAT_GET_RFNENTRY_INT64(stat) \ +Datum \ +CppConcat(pg_stat_get_rfn_,stat)(PG_FUNCTION_ARGS) \ +{ \ + Oid rfn = PG_GETARG_OID(0); \ + int64 result; \ + PgStat_StatRFNodeEntry *rfnentry; \ + \ + if ((rfnentry = pgstat_fetch_stat_rfnodeentry(MyDatabaseId, rfn)) == NULL) \ + result = 0; \ + else \ + result = (int64) (rfnentry->stat); \ + \ + PG_RETURN_INT64(result); \ +} + +/* pg_stat_get_rfn_tuples_inserted */ +PG_STAT_GET_RFNENTRY_INT64(tuples_inserted) + +/* pg_stat_get_rfn_tuples_updated */ +PG_STAT_GET_RFNENTRY_INT64(tuples_updated) + +/* pg_stat_get_rfn_tuples_deleted */ +PG_STAT_GET_RFNENTRY_INT64(tuples_deleted) + +/* pg_stat_get_rfn_tuples_hot_updated */ +PG_STAT_GET_RFNENTRY_INT64(tuples_hot_updated) + +/* pg_stat_get_rfn_tuples_newpage_updated */ +PG_STAT_GET_RFNENTRY_INT64(tuples_newpage_updated) + +/* pg_stat_get_rfn_live_tuples */ +PG_STAT_GET_RFNENTRY_INT64(live_tuples) + +/* pg_stat_get_rfn_dead_tuples */ +PG_STAT_GET_RFNENTRY_INT64(dead_tuples) + +/* pg_stat_get_rfn_mod_since_analyze */ +PG_STAT_GET_RFNENTRY_INT64(mod_since_analyze) + +/* pg_stat_get_rfn_ins_since_vacuum */ +PG_STAT_GET_RFNENTRY_INT64(ins_since_vacuum) + /* * Accessor macro for index stats entries (PgStat_StatIdxEntry). */ diff --git a/src/test/isolation/expected/stats.out b/src/test/isolation/expected/stats.out index cfad309ccf34..1ede5af1cf81 100644 --- a/src/test/isolation/expected/stats.out +++ b/src/test/isolation/expected/stats.out @@ -2186,18 +2186,18 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count --------+------------+---------+---------+---------+----------+----------+------------ - 0| 0| 0| 0| 0| 0| 0| 0 + 0| 0| | | | | | 0 (1 row) @@ -2230,18 +2230,18 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count --------+------------+---------+---------+---------+----------+----------+------------ - 0| 0| 0| 0| 0| 0| 0| 0 + 0| 0| | | | | | 0 (1 row) @@ -2256,11 +2256,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2295,11 +2295,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2334,11 +2334,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2389,11 +2389,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2421,11 +2421,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2483,11 +2483,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2515,11 +2515,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2578,11 +2578,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2647,11 +2647,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2708,11 +2708,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2775,11 +2775,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2815,18 +2815,18 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count --------+------------+---------+---------+---------+----------+----------+------------ - 3| 9| 5| 1| 0| 1| 1| 0 + 3| 9| 0| 0| 0| 0| 0| 0 (1 row) @@ -2861,18 +2861,18 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' seq_scan|seq_tup_read|n_tup_ins|n_tup_upd|n_tup_del|n_live_tup|n_dead_tup|vacuum_count --------+------------+---------+---------+---------+----------+----------+------------ - 3| 9| 5| 1| 0| 1| 1| 0 + 3| 9| 0| 0| 0| 0| 0| 0 (1 row) @@ -2901,11 +2901,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2947,11 +2947,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -2988,11 +2988,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' @@ -3035,11 +3035,11 @@ step s1_table_stats: SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' diff --git a/src/test/isolation/specs/stats.spec b/src/test/isolation/specs/stats.spec index da16710da0fb..6eadc90463f2 100644 --- a/src/test/isolation/specs/stats.spec +++ b/src/test/isolation/specs/stats.spec @@ -102,11 +102,11 @@ step s1_table_stats { SELECT pg_stat_get_numscans(tso.oid) AS seq_scan, pg_stat_get_tuples_returned(tso.oid) AS seq_tup_read, - pg_stat_get_tuples_inserted(tso.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(tso.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(tso.oid) AS n_tup_del, - pg_stat_get_live_tuples(tso.oid) AS n_live_tup, - pg_stat_get_dead_tuples(tso.oid) AS n_dead_tup, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode(tso.oid)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode(tso.oid)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode(tso.oid)) AS n_tup_del, + pg_stat_get_rfn_live_tuples(pg_relation_filenode(tso.oid)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode(tso.oid)) AS n_dead_tup, pg_stat_get_vacuum_count(tso.oid) AS vacuum_count FROM test_stat_oid AS tso WHERE tso.name = 'test_stat_tab' diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index ffec0903f038..3e3ef4f189b2 100644 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -1825,15 +1825,15 @@ pg_stat_all_tables| SELECT c.oid AS relid, (sum(pg_stat_get_idx_numscans(i.indexrelid)))::bigint AS idx_scan, max(pg_stat_get_idx_lastscan(i.indexrelid)) AS last_idx_scan, ((sum(pg_stat_get_idx_tuples_fetched(i.indexrelid)))::bigint + pg_stat_get_tuples_fetched(c.oid)) AS idx_tup_fetch, - pg_stat_get_tuples_inserted(c.oid) AS n_tup_ins, - pg_stat_get_tuples_updated(c.oid) AS n_tup_upd, - pg_stat_get_tuples_deleted(c.oid) AS n_tup_del, - pg_stat_get_tuples_hot_updated(c.oid) AS n_tup_hot_upd, - pg_stat_get_tuples_newpage_updated(c.oid) AS n_tup_newpage_upd, - pg_stat_get_live_tuples(c.oid) AS n_live_tup, - pg_stat_get_dead_tuples(c.oid) AS n_dead_tup, - pg_stat_get_mod_since_analyze(c.oid) AS n_mod_since_analyze, - pg_stat_get_ins_since_vacuum(c.oid) AS n_ins_since_vacuum, + pg_stat_get_rfn_tuples_inserted(pg_relation_filenode((c.oid)::regclass)) AS n_tup_ins, + pg_stat_get_rfn_tuples_updated(pg_relation_filenode((c.oid)::regclass)) AS n_tup_upd, + pg_stat_get_rfn_tuples_deleted(pg_relation_filenode((c.oid)::regclass)) AS n_tup_del, + pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode((c.oid)::regclass)) AS n_tup_hot_upd, + pg_stat_get_rfn_tuples_newpage_updated(pg_relation_filenode((c.oid)::regclass)) AS n_tup_newpage_upd, + pg_stat_get_rfn_live_tuples(pg_relation_filenode((c.oid)::regclass)) AS n_live_tup, + pg_stat_get_rfn_dead_tuples(pg_relation_filenode((c.oid)::regclass)) AS n_dead_tup, + pg_stat_get_rfn_mod_since_analyze(pg_relation_filenode((c.oid)::regclass)) AS n_mod_since_analyze, + pg_stat_get_rfn_ins_since_vacuum(pg_relation_filenode((c.oid)::regclass)) AS n_ins_since_vacuum, pg_stat_get_last_vacuum_time(c.oid) AS last_vacuum, pg_stat_get_last_autovacuum_time(c.oid) AS last_autovacuum, pg_stat_get_last_analyze_time(c.oid) AS last_analyze, diff --git a/src/test/regress/expected/stats.out b/src/test/regress/expected/stats.out index b44e30f557c9..f7d573b890aa 100644 --- a/src/test/regress/expected/stats.out +++ b/src/test/regress/expected/stats.out @@ -128,14 +128,15 @@ SELECT id, name, fixed_amount, 5 | replslot | f | t | t 6 | subscription | f | t | t 7 | backend | f | t | f - 8 | archiver | t | f | t - 9 | bgwriter | t | f | t - 10 | checkpointer | t | f | t - 11 | io | t | f | t - 12 | lock | t | f | t - 13 | slru | t | f | t - 14 | wal | t | f | t -(14 rows) + 8 | relfilenode | f | f | t + 9 | archiver | t | f | t + 10 | bgwriter | t | f | t + 11 | checkpointer | t | f | t + 12 | io | t | f | t + 13 | lock | t | f | t + 14 | slru | t | f | t + 15 | wal | t | f | t +(15 rows) -- ensure that both seqscan and indexscan plans are allowed SET enable_seqscan TO on; @@ -241,9 +242,9 @@ SELECT relname, n_tup_ins, n_tup_upd, n_tup_del, n_live_tup, n_dead_tup WHERE relname like 'trunc_stats_test%' order by relname; relname | n_tup_ins | n_tup_upd | n_tup_del | n_live_tup | n_dead_tup -------------------+-----------+-----------+-----------+------------+------------ - trunc_stats_test | 3 | 0 | 0 | 0 | 0 - trunc_stats_test1 | 4 | 2 | 1 | 1 | 0 - trunc_stats_test2 | 1 | 0 | 0 | 1 | 0 + trunc_stats_test | 0 | 0 | 0 | 0 | 0 + trunc_stats_test1 | 0 | 0 | 0 | 0 | 0 + trunc_stats_test2 | 0 | 0 | 0 | 0 | 0 trunc_stats_test3 | 4 | 0 | 0 | 2 | 2 trunc_stats_test4 | 2 | 0 | 0 | 0 | 2 (5 rows) @@ -470,30 +471,30 @@ SELECT pg_stat_get_function_calls(:stats_test_func2_oid); -- by oid after the DROP TABLE. Save oids. CREATE TABLE drop_stats_test(); INSERT INTO drop_stats_test DEFAULT VALUES; -SELECT 'drop_stats_test'::regclass::oid AS drop_stats_test_oid \gset +SELECT pg_relation_filenode('drop_stats_test'::regclass) AS drop_stats_test_oid \gset CREATE TABLE drop_stats_test_xact(); INSERT INTO drop_stats_test_xact DEFAULT VALUES; -SELECT 'drop_stats_test_xact'::regclass::oid AS drop_stats_test_xact_oid \gset +SELECT pg_relation_filenode('drop_stats_test_xact'::regclass) AS drop_stats_test_xact_oid \gset CREATE TABLE drop_stats_test_subxact(); INSERT INTO drop_stats_test_subxact DEFAULT VALUES; -SELECT 'drop_stats_test_subxact'::regclass::oid AS drop_stats_test_subxact_oid \gset +SELECT pg_relation_filenode('drop_stats_test_subxact'::regclass) AS drop_stats_test_subxact_oid \gset SELECT pg_stat_force_next_flush(); pg_stat_force_next_flush -------------------------- (1 row) -SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); - pg_stat_get_live_tuples -------------------------- - 1 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) DROP TABLE drop_stats_test; -SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); - pg_stat_get_live_tuples -------------------------- - 0 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_oid); @@ -504,18 +505,18 @@ SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_oid); -- check that rollback protects against having stats dropped and that local -- modifications don't pose a problem -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); - pg_stat_get_live_tuples -------------------------- - 1 -(1 row) - -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); - pg_stat_get_tuples_inserted +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_rfn_live_tuples ----------------------------- 1 (1 row) +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_rfn_tuples_inserted +--------------------------------- + 1 +(1 row) + SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); pg_stat_get_xact_tuples_inserted ---------------------------------- @@ -544,29 +545,29 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); - pg_stat_get_live_tuples -------------------------- - 1 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); - pg_stat_get_tuples_inserted ------------------------------ - 2 +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_rfn_tuples_inserted +--------------------------------- + 2 (1 row) -- transactional drop -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); - pg_stat_get_live_tuples -------------------------- - 1 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); - pg_stat_get_tuples_inserted ------------------------------ - 2 +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_rfn_tuples_inserted +--------------------------------- + 2 (1 row) BEGIN; @@ -591,23 +592,23 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); - pg_stat_get_live_tuples -------------------------- - 0 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); - pg_stat_get_tuples_inserted ------------------------------ - 0 +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); + pg_stat_get_rfn_tuples_inserted +--------------------------------- + 2 (1 row) -- savepoint rollback (2 levels) -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 1 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 1 (1 row) BEGIN; @@ -636,17 +637,17 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 3 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 3 (1 row) -- savepoint rolback (1 level) -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 3 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 3 (1 row) BEGIN; @@ -655,17 +656,17 @@ DROP TABLE drop_stats_test_subxact; SAVEPOINT sp2; ROLLBACK TO SAVEPOINT sp1; COMMIT; -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 3 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 3 (1 row) -- and now actually drop -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 3 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 3 (1 row) BEGIN; @@ -674,10 +675,10 @@ DROP TABLE drop_stats_test_subxact; SAVEPOINT sp2; RELEASE SAVEPOINT sp1; COMMIT; -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); - pg_stat_get_live_tuples -------------------------- - 0 +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); + pg_stat_get_rfn_live_tuples +----------------------------- + 3 (1 row) DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; @@ -945,7 +946,7 @@ SELECT (n_tup_ins + n_tup_upd) > 0 AS has_data FROM pg_stat_all_tables WHERE relid = 'pg_shdescription'::regclass; has_data ---------- - t + f (1 row) -- stats_reset may not be set for datid=0 and shared objects in @@ -1902,7 +1903,7 @@ DECLARE BEGIN -- we don't want to wait forever; loop will exit after 30 seconds FOR i IN 1 .. 300 LOOP - SELECT (pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid) > 0) INTO updated; + SELECT (pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode('brin_hot'::regclass::oid)) > 0) INTO updated; EXIT WHEN updated; -- wait a little @@ -1929,10 +1930,10 @@ SELECT wait_for_hot_stats(); (1 row) -SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); - pg_stat_get_tuples_hot_updated --------------------------------- - 1 +SELECT pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode('brin_hot'::regclass::oid)); + pg_stat_get_rfn_tuples_hot_updated +------------------------------------ + 1 (1 row) DROP TABLE brin_hot; diff --git a/src/test/regress/expected/stats_rewrite.out b/src/test/regress/expected/stats_rewrite.out index 93752bab9cb3..4f341672e5f1 100644 --- a/src/test/regress/expected/stats_rewrite.out +++ b/src/test/regress/expected/stats_rewrite.out @@ -42,7 +42,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 1 | 1 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_2pc_rewrite_alone; @@ -66,7 +66,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 4 | 4 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_2pc; @@ -93,7 +93,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc_multi'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 6 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_2pc_multi; @@ -114,7 +114,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc_rewrite_alone_abort'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 1 | 1 | 0 + 2 | 1 | 1 (1 row) DROP TABLE test_2pc_rewrite_alone_abort; @@ -138,7 +138,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc_abort'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 4 | 1 | 3 + 7 | 1 | 6 (1 row) DROP TABLE test_2pc_abort; @@ -169,7 +169,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_2pc_savepoint'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 3 | 3 + 0 | 0 | 0 (1 row) DROP TABLE test_2pc_savepoint; @@ -209,7 +209,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_alone'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 1 | 1 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_alone; @@ -232,7 +232,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 4 | 4 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test; @@ -258,7 +258,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_multi'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 6 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_multi; @@ -331,7 +331,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_savepoint'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 3 | 3 + 0 | 0 | 0 (1 row) DROP TABLE test_savepoint; diff --git a/src/test/regress/expected/stats_rewrite_1.out b/src/test/regress/expected/stats_rewrite_1.out index 909188b18fd7..32c8cf803ebe 100644 --- a/src/test/regress/expected/stats_rewrite_1.out +++ b/src/test/regress/expected/stats_rewrite_1.out @@ -230,7 +230,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_alone'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 1 | 1 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_alone; @@ -253,7 +253,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 4 | 4 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test; @@ -279,7 +279,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_multi'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 6 | 0 + 0 | 0 | 0 (1 row) DROP TABLE test_multi; @@ -352,7 +352,7 @@ SELECT n_tup_ins, n_live_tup, n_dead_tup FROM pg_stat_all_tables WHERE relname = 'test_savepoint'; n_tup_ins | n_live_tup | n_dead_tup -----------+------------+------------ - 6 | 3 | 3 + 0 | 0 | 0 (1 row) DROP TABLE test_savepoint; diff --git a/src/test/regress/sql/stats.sql b/src/test/regress/sql/stats.sql index d4623c32cd32..9188429e03ca 100644 --- a/src/test/regress/sql/stats.sql +++ b/src/test/regress/sql/stats.sql @@ -219,27 +219,27 @@ SELECT pg_stat_get_function_calls(:stats_test_func2_oid); -- by oid after the DROP TABLE. Save oids. CREATE TABLE drop_stats_test(); INSERT INTO drop_stats_test DEFAULT VALUES; -SELECT 'drop_stats_test'::regclass::oid AS drop_stats_test_oid \gset +SELECT pg_relation_filenode('drop_stats_test'::regclass) AS drop_stats_test_oid \gset CREATE TABLE drop_stats_test_xact(); INSERT INTO drop_stats_test_xact DEFAULT VALUES; -SELECT 'drop_stats_test_xact'::regclass::oid AS drop_stats_test_xact_oid \gset +SELECT pg_relation_filenode('drop_stats_test_xact'::regclass) AS drop_stats_test_xact_oid \gset CREATE TABLE drop_stats_test_subxact(); INSERT INTO drop_stats_test_subxact DEFAULT VALUES; -SELECT 'drop_stats_test_subxact'::regclass::oid AS drop_stats_test_subxact_oid \gset +SELECT pg_relation_filenode('drop_stats_test_subxact'::regclass) AS drop_stats_test_subxact_oid \gset SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_oid); DROP TABLE drop_stats_test; -SELECT pg_stat_get_live_tuples(:drop_stats_test_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_oid); SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_oid); -- check that rollback protects against having stats dropped and that local -- modifications don't pose a problem -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); BEGIN; INSERT INTO drop_stats_test_xact DEFAULT VALUES; @@ -248,12 +248,12 @@ DROP TABLE drop_stats_test_xact; SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); ROLLBACK; SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); -- transactional drop -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); BEGIN; INSERT INTO drop_stats_test_xact DEFAULT VALUES; SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); @@ -261,11 +261,11 @@ DROP TABLE drop_stats_test_xact; SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_xact_oid); COMMIT; SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples(:drop_stats_test_xact_oid); -SELECT pg_stat_get_tuples_inserted(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_xact_oid); +SELECT pg_stat_get_rfn_tuples_inserted(:drop_stats_test_xact_oid); -- savepoint rollback (2 levels) -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); BEGIN; INSERT INTO drop_stats_test_subxact DEFAULT VALUES; SAVEPOINT sp1; @@ -277,27 +277,27 @@ ROLLBACK TO SAVEPOINT sp2; SELECT pg_stat_get_xact_tuples_inserted(:drop_stats_test_subxact_oid); COMMIT; SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); -- savepoint rolback (1 level) -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); BEGIN; SAVEPOINT sp1; DROP TABLE drop_stats_test_subxact; SAVEPOINT sp2; ROLLBACK TO SAVEPOINT sp1; COMMIT; -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); -- and now actually drop -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); BEGIN; SAVEPOINT sp1; DROP TABLE drop_stats_test_subxact; SAVEPOINT sp2; RELEASE SAVEPOINT sp1; COMMIT; -SELECT pg_stat_get_live_tuples(:drop_stats_test_subxact_oid); +SELECT pg_stat_get_rfn_live_tuples(:drop_stats_test_subxact_oid); DROP TABLE trunc_stats_test, trunc_stats_test1, trunc_stats_test2, trunc_stats_test3, trunc_stats_test4; DROP TABLE prevstats; @@ -898,7 +898,7 @@ DECLARE BEGIN -- we don't want to wait forever; loop will exit after 30 seconds FOR i IN 1 .. 300 LOOP - SELECT (pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid) > 0) INTO updated; + SELECT (pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode('brin_hot'::regclass::oid)) > 0) INTO updated; EXIT WHEN updated; -- wait a little @@ -923,7 +923,7 @@ UPDATE brin_hot SET val = -3 WHERE id = 42; \c - SELECT wait_for_hot_stats(); -SELECT pg_stat_get_tuples_hot_updated('brin_hot'::regclass::oid); +SELECT pg_stat_get_rfn_tuples_hot_updated(pg_relation_filenode('brin_hot'::regclass::oid)); DROP TABLE brin_hot; DROP FUNCTION wait_for_hot_stats(); diff --git a/contrib/postgres_fdw/expected/postgres_fdw.out b/contrib/postgres_fdw/expected/postgres_fdw.out index 5ebae1cedc2f..eed714f7d588 100644 --- a/contrib/postgres_fdw/expected/postgres_fdw.out +++ b/contrib/postgres_fdw/expected/postgres_fdw.out @@ -12988,12 +12988,12 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT pg_stat_get_live_tuples('public.simport_ftable'::regclass), - pg_stat_get_dead_tuples('public.simport_ftable'::regclass), +SELECT pg_stat_get_rfn_live_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), + pg_stat_get_rfn_dead_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), pg_stat_get_analyze_count('public.simport_ftable'::regclass); - pg_stat_get_live_tuples | pg_stat_get_dead_tuples | pg_stat_get_analyze_count --------------------------+-------------------------+--------------------------- - 0 | 0 | 1 + pg_stat_get_rfn_live_tuples | pg_stat_get_rfn_dead_tuples | pg_stat_get_analyze_count +-----------------------------+-----------------------------+--------------------------- + | | 1 (1 row) ALTER TABLE simport_table ALTER COLUMN c1 SET STATISTICS 0; @@ -13023,12 +13023,12 @@ SELECT pg_stat_force_next_flush(); (1 row) -SELECT pg_stat_get_live_tuples('public.simport_ftable'::regclass), - pg_stat_get_dead_tuples('public.simport_ftable'::regclass), +SELECT pg_stat_get_rfn_live_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), + pg_stat_get_rfn_dead_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), pg_stat_get_analyze_count('public.simport_ftable'::regclass); - pg_stat_get_live_tuples | pg_stat_get_dead_tuples | pg_stat_get_analyze_count --------------------------+-------------------------+--------------------------- - 4 | 0 | 1 + pg_stat_get_rfn_live_tuples | pg_stat_get_rfn_dead_tuples | pg_stat_get_analyze_count +-----------------------------+-----------------------------+--------------------------- + | | 1 (1 row) ANALYZE VERBOSE simport_ftable (c1); -- should work diff --git a/contrib/postgres_fdw/sql/postgres_fdw.sql b/contrib/postgres_fdw/sql/postgres_fdw.sql index e868da00ace7..a3be2f260280 100644 --- a/contrib/postgres_fdw/sql/postgres_fdw.sql +++ b/contrib/postgres_fdw/sql/postgres_fdw.sql @@ -4590,8 +4590,8 @@ ANALYZE simport_table; SELECT pg_stat_reset_single_table_counters('public.simport_ftable'::regclass); ANALYZE VERBOSE simport_ftable; -- should work SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples('public.simport_ftable'::regclass), - pg_stat_get_dead_tuples('public.simport_ftable'::regclass), +SELECT pg_stat_get_rfn_live_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), + pg_stat_get_rfn_dead_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), pg_stat_get_analyze_count('public.simport_ftable'::regclass); ALTER TABLE simport_table ALTER COLUMN c1 SET STATISTICS 0; @@ -4612,8 +4612,8 @@ ANALYZE simport_table; SELECT pg_stat_reset_single_table_counters('public.simport_ftable'::regclass); ANALYZE VERBOSE simport_ftable; -- should work SELECT pg_stat_force_next_flush(); -SELECT pg_stat_get_live_tuples('public.simport_ftable'::regclass), - pg_stat_get_dead_tuples('public.simport_ftable'::regclass), +SELECT pg_stat_get_rfn_live_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), + pg_stat_get_rfn_dead_tuples(pg_relation_filenode('public.simport_ftable'::regclass)), pg_stat_get_analyze_count('public.simport_ftable'::regclass); ANALYZE VERBOSE simport_ftable (c1); -- should work -- 2.55.0