diff --git a/doc/src/sgml/maintenance.sgml b/doc/src/sgml/maintenance.sgml index 998a48fc257..36f975b1e5b 100644 --- a/doc/src/sgml/maintenance.sgml +++ b/doc/src/sgml/maintenance.sgml @@ -817,12 +817,6 @@ analyze threshold = analyze base threshold + analyze scale factor * number of tu is compared to the total number of tuples inserted, updated, or deleted since the last ANALYZE. - For partitioned tables, inserts, updates and deletes on partitions - are counted towards this threshold; however, DDL - operations such as ATTACH, DETACH - and DROP are not, so running a manual - ANALYZE is recommended if the partition added or - removed contains a statistically significant volume of data. diff --git a/doc/src/sgml/perform.sgml b/doc/src/sgml/perform.sgml index ddd6c3ff3e0..89ff58338e5 100644 --- a/doc/src/sgml/perform.sgml +++ b/doc/src/sgml/perform.sgml @@ -1767,8 +1767,7 @@ SELECT * FROM x, y, a, b, c WHERE something AND somethingelse; Whenever you have significantly altered the distribution of data within a table, running ANALYZE is strongly recommended. This - includes bulk loading large amounts of data into the table as well as - attaching, detaching or dropping partitions. Running + includes bulk loading large amounts of data into the table. Running ANALYZE (or VACUUM ANALYZE) ensures that the planner has up-to-date statistics about the table. With no statistics or obsolete statistics, the planner might diff --git a/doc/src/sgml/ref/analyze.sgml b/doc/src/sgml/ref/analyze.sgml index 176c7cb2256..c8fcebc1612 100644 --- a/doc/src/sgml/ref/analyze.sgml +++ b/doc/src/sgml/ref/analyze.sgml @@ -250,38 +250,20 @@ ANALYZE [ VERBOSE ] [ table_and_columns - If the table being analyzed is partitioned, ANALYZE - will gather statistics by sampling blocks randomly from its partitions; - in addition, it will recurse into each partition and update its statistics. - (However, in multi-level partitioning scenarios, each leaf partition - will only be analyzed once.) - By contrast, if the table being analyzed has inheritance children, - ANALYZE will gather statistics for it twice: - once on the rows of the parent table only, and a second time on the - rows of the parent table with all of its children. This second set of - statistics is needed when planning queries that traverse the entire - inheritance tree. The child tables themselves are not individually - analyzed in this case. + If the table being analyzed has one or more children, + ANALYZE will gather statistics twice: once on the + rows of the parent table only, and a second time on the rows of the + parent table with all of its children. This second set of statistics + is needed when planning queries that traverse the entire inheritance + tree. The autovacuum daemon, however, will only consider inserts or + updates on the parent table itself when deciding whether to trigger an + automatic analyze for that table. If that table is rarely inserted into + or updated, the inheritance statistics will not be up to date unless you + run ANALYZE manually. - The autovacuum daemon counts inserts, updates and deletes in the - partitions to determine if auto-analyze is needed. However, adding - or removing partitions does not affect autovacuum daemon decisions, - so triggering a manual ANALYZE is recommended - when this occurs. - - - - Tuples changed in inheritance children do not count towards analyze - on the parent table. If the parent table is empty or rarely modified, - it may never be processed by autovacuum. It's necessary to - periodically run a manual ANALYZE to keep the - statistics of the table hierarchy up to date. - - - - If any of the child tables or partitions are foreign tables whose foreign data wrappers + If any of the child tables are foreign tables whose foreign data wrappers do not support ANALYZE, those child tables are ignored while gathering inheritance statistics. diff --git a/doc/src/sgml/ref/create_table.sgml b/doc/src/sgml/ref/create_table.sgml index 15aed2f2515..473a0a4aebd 100644 --- a/doc/src/sgml/ref/create_table.sgml +++ b/doc/src/sgml/ref/create_table.sgml @@ -1374,8 +1374,8 @@ WITH ( MODULUS numeric_literal, REM If a table parameter value is set and the equivalent toast. parameter is not, the TOAST table will use the table's parameter value. - Except where noted, these parameters are not supported on partitioned - tables; however, you can specify them on individual leaf partitions. + Specifying these parameters for partitioned tables is not supported, + but you may specify them for individual leaf partitions. @@ -1457,8 +1457,6 @@ WITH ( MODULUS numeric_literal, REM If true, the autovacuum daemon will perform automatic VACUUM and/or ANALYZE operations on this table following the rules discussed in . - This parameter can be set for partitioned tables to prevent autovacuum - from running ANALYZE on them. If false, this table will not be autovacuumed, except to prevent transaction ID wraparound. See for more about wraparound prevention. @@ -1590,7 +1588,6 @@ WITH ( MODULUS numeric_literal, REM Per-table value for parameter. - This parameter can be set for partitioned tables. @@ -1606,7 +1603,6 @@ WITH ( MODULUS numeric_literal, REM Per-table value for parameter. - This parameter can be set for partitioned tables. diff --git a/doc/src/sgml/ref/pg_restore.sgml b/doc/src/sgml/ref/pg_restore.sgml index 35cd56297c8..93ea937ac8e 100644 --- a/doc/src/sgml/ref/pg_restore.sgml +++ b/doc/src/sgml/ref/pg_restore.sgml @@ -922,10 +922,8 @@ CREATE DATABASE foo WITH TEMPLATE template0; Once restored, it is wise to run ANALYZE on each - restored table so the optimizer has useful statistics. - If the table is a partition or an inheritance child, it may also be useful - to analyze the parent to update statistics for the table hierarchy. - See and + restored table so the optimizer has useful statistics; see + and for more information. diff --git a/src/backend/access/common/reloptions.c b/src/backend/access/common/reloptions.c index 7566265bcb1..b5602f53233 100644 --- a/src/backend/access/common/reloptions.c +++ b/src/backend/access/common/reloptions.c @@ -108,7 +108,7 @@ static relopt_bool boolRelOpts[] = { "autovacuum_enabled", "Enables autovacuum in this relation", - RELOPT_KIND_HEAP | RELOPT_KIND_TOAST | RELOPT_KIND_PARTITIONED, + RELOPT_KIND_HEAP | RELOPT_KIND_TOAST, ShareUpdateExclusiveLock }, true @@ -237,7 +237,7 @@ static relopt_int intRelOpts[] = { "autovacuum_analyze_threshold", "Minimum number of tuple inserts, updates or deletes prior to analyze", - RELOPT_KIND_HEAP | RELOPT_KIND_PARTITIONED, + RELOPT_KIND_HEAP, ShareUpdateExclusiveLock }, -1, 0, INT_MAX @@ -411,7 +411,7 @@ static relopt_real realRelOpts[] = { "autovacuum_analyze_scale_factor", "Number of tuple inserts, updates or deletes prior to analyze as a fraction of reltuples", - RELOPT_KIND_HEAP | RELOPT_KIND_PARTITIONED, + RELOPT_KIND_HEAP, ShareUpdateExclusiveLock }, -1, 0.0, 100.0 @@ -1979,11 +1979,12 @@ bytea * partitioned_table_reloptions(Datum reloptions, bool validate) { /* - * autovacuum_enabled, autovacuum_analyze_threshold and - * autovacuum_analyze_scale_factor are supported for partitioned tables. + * There are no options for partitioned tables yet, but this is able to do + * some validation. */ - - return default_reloptions(reloptions, validate, RELOPT_KIND_PARTITIONED); + return (bytea *) build_reloptions(reloptions, validate, + RELOPT_KIND_PARTITIONED, + 0, NULL, 0); } /* diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c index 0099a04bbe6..8d7b38d1707 100644 --- a/src/backend/commands/analyze.c +++ b/src/backend/commands/analyze.c @@ -626,8 +626,8 @@ do_analyze_rel(Relation onerel, VacuumParams *params, PROGRESS_ANALYZE_PHASE_FINALIZE_ANALYZE); /* - * Update pages/tuples stats in pg_class ... but not if we're doing - * inherited stats. + * Update pages/tuples stats in pg_class, and report ANALYZE to the stats + * collector ... but not if we're doing inherited stats. * * We assume that VACUUM hasn't set pg_class.reltuples already, even * during a VACUUM ANALYZE. Although VACUUM often updates pg_class, @@ -668,47 +668,19 @@ do_analyze_rel(Relation onerel, VacuumParams *params, InvalidMultiXactId, in_outer_xact); } - } - else if (onerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - { - /* - * Partitioned tables don't have storage, so we don't set any fields - * in their pg_class entries except for reltuples, which is necessary - * for auto-analyze to work properly, and relhasindex. - */ - vac_update_relstats(onerel, -1, totalrows, - 0, hasindex, InvalidTransactionId, - InvalidMultiXactId, - in_outer_xact); - } - /* - * Now report ANALYZE to the stats collector. For regular tables, we do - * it only if not doing inherited stats. For partitioned tables, we only - * do it for inherited stats. (We're never called for not-inherited stats - * on partitioned tables anyway.) - * - * Reset the changes_since_analyze counter only if we analyzed all - * columns; otherwise, there is still work for auto-analyze to do. - */ - if (!inh || onerel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) + /* + * Now report ANALYZE to the stats collector. + * + * We deliberately don't report to the stats collector when doing + * inherited stats, because the stats collector only tracks per-table + * stats. + * + * Reset the changes_since_analyze counter only if we analyzed all + * columns; otherwise, there is still work for auto-analyze to do. + */ pgstat_report_analyze(onerel, totalrows, totaldeadrows, (va_cols == NIL)); - - /* - * If this is a manual analyze of all columns of a permanent leaf - * partition, and not doing inherited stats, also let the collector know - * about the ancestor tables of this partition. Autovacuum does the - * equivalent of this at the start of its run, so there's no reason to do - * it there. - */ - if (!inh && !IsAutoVacuumWorkerProcess() && - (va_cols == NIL) && - onerel->rd_rel->relispartition && - onerel->rd_rel->relkind == RELKIND_RELATION && - onerel->rd_rel->relpersistence == RELPERSISTENCE_PERMANENT) - { - pgstat_report_anl_ancestors(RelationGetRelid(onerel)); } /* diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index 6dae7e99ace..bd3e701ca3a 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -335,7 +335,6 @@ typedef struct ForeignTruncateInfo static void truncate_check_rel(Oid relid, Form_pg_class reltuple); static void truncate_check_perms(Oid relid, Form_pg_class reltuple); static void truncate_check_activity(Relation rel); -static void truncate_update_partedrel_stats(List *parted_rels); static void RangeVarCallbackForTruncate(const RangeVar *relation, Oid relId, Oid oldRelId, void *arg); static List *MergeAttributes(List *schema, List *supers, char relpersistence, @@ -1739,7 +1738,6 @@ ExecuteTruncateGuts(List *explicit_rels, { List *rels; List *seq_relids = NIL; - List *parted_rels = NIL; HTAB *ft_htab = NULL; EState *estate; ResultRelInfo *resultRelInfos; @@ -1888,15 +1886,9 @@ ExecuteTruncateGuts(List *explicit_rels, { Relation rel = (Relation) lfirst(cell); - /* - * Save OID of partitioned tables for later; nothing else to do for - * them here. - */ + /* Skip partitioned tables as there is nothing to do */ if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - { - parted_rels = lappend_oid(parted_rels, RelationGetRelid(rel)); continue; - } /* * Build the lists of foreign tables belonging to each foreign server @@ -2044,9 +2036,6 @@ ExecuteTruncateGuts(List *explicit_rels, ResetSequence(seq_relid); } - /* Reset partitioned tables' pg_class.reltuples */ - truncate_update_partedrel_stats(parted_rels); - /* * Write a WAL record to allow this set of actions to be logically * decoded. @@ -2193,40 +2182,6 @@ truncate_check_activity(Relation rel) CheckTableNotInUse(rel, "TRUNCATE"); } -/* - * Update pg_class.reltuples for all the given partitioned tables to 0. - */ -static void -truncate_update_partedrel_stats(List *parted_rels) -{ - Relation pg_class; - ListCell *lc; - - pg_class = table_open(RelationRelationId, RowExclusiveLock); - - foreach(lc, parted_rels) - { - Oid relid = lfirst_oid(lc); - HeapTuple tuple; - Form_pg_class rd_rel; - - tuple = SearchSysCacheCopy1(RELOID, ObjectIdGetDatum(relid)); - if (!HeapTupleIsValid(tuple)) - elog(ERROR, "could not find tuple for relation %u", relid); - rd_rel = (Form_pg_class) GETSTRUCT(tuple); - if (rd_rel->reltuples != (float4) 0) - { - rd_rel->reltuples = (float4) 0; - - heap_inplace_update(pg_class, tuple); - } - - heap_freetuple(tuple); - } - - table_close(pg_class, RowExclusiveLock); -} - /* * storage_name * returns the name corresponding to a typstorage/attstorage enum value diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 912ef9cb54c..fefc07e1080 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -75,7 +75,6 @@ #include "catalog/dependency.h" #include "catalog/namespace.h" #include "catalog/pg_database.h" -#include "catalog/pg_inherits.h" #include "commands/dbcommands.h" #include "commands/vacuum.h" #include "lib/ilist.h" @@ -1970,7 +1969,6 @@ do_autovacuum(void) int effective_multixact_freeze_max_age; bool did_vacuum = false; bool found_concurrent_worker = false; - bool updated = false; int i; /* @@ -2056,19 +2054,12 @@ do_autovacuum(void) /* * Scan pg_class to determine which tables to vacuum. * - * We do this in three passes: First we let pgstat collector know about - * the partitioned table ancestors of all partitions that have recently - * acquired rows for analyze. This informs the second pass about the - * total number of tuple count in partitioning hierarchies. - * - * On the second pass, we collect the list of plain relations, - * materialized views and partitioned tables. On the third one we collect - * TOAST tables. - * - * The reason for doing the third pass is that during it we want to use - * the main relation's pg_class.reloptions entry if the TOAST table does - * not have any, and we cannot obtain it unless we know beforehand what's - * the main table OID. + * We do this in two passes: on the first one we collect the list of plain + * relations and materialized views, and on the second one we collect + * TOAST tables. The reason for doing the second pass is that during it we + * want to use the main relation's pg_class.reloptions entry if the TOAST + * table does not have any, and we cannot obtain it unless we know + * beforehand what's the main table OID. * * We need to check TOAST tables separately because in cases with short, * wide tables there might be proportionally much more activity in the @@ -2077,44 +2068,7 @@ do_autovacuum(void) relScan = table_beginscan_catalog(classRel, 0, NULL); /* - * First pass: before collecting the list of tables to vacuum, let stat - * collector know about partitioned-table ancestors of each partition. - */ - while ((tuple = heap_getnext(relScan, ForwardScanDirection)) != NULL) - { - Form_pg_class classForm = (Form_pg_class) GETSTRUCT(tuple); - Oid relid = classForm->oid; - PgStat_StatTabEntry *tabentry; - - /* Only consider permanent leaf partitions */ - if (!classForm->relispartition || - classForm->relkind == RELKIND_PARTITIONED_TABLE || - classForm->relpersistence == RELPERSISTENCE_TEMP) - continue; - - /* - * No need to do this for partitions that haven't acquired any rows. - */ - tabentry = pgstat_fetch_stat_tabentry(relid); - if (tabentry && - tabentry->changes_since_analyze - - tabentry->changes_since_analyze_reported > 0) - { - pgstat_report_anl_ancestors(relid); - updated = true; - } - } - - /* Acquire fresh stats for the next passes, if needed */ - if (updated) - { - autovac_refresh_stats(); - dbentry = pgstat_fetch_stat_dbentry(MyDatabaseId); - shared = pgstat_fetch_stat_dbentry(InvalidOid); - } - - /* - * On the second pass, we collect main tables to vacuum, and also the main + * On the first pass, we collect main tables to vacuum, and also the main * table relid to TOAST relid mapping. */ while ((tuple = heap_getnext(relScan, ForwardScanDirection)) != NULL) @@ -2128,8 +2082,7 @@ do_autovacuum(void) bool wraparound; if (classForm->relkind != RELKIND_RELATION && - classForm->relkind != RELKIND_MATVIEW && - classForm->relkind != RELKIND_PARTITIONED_TABLE) + classForm->relkind != RELKIND_MATVIEW) continue; relid = classForm->oid; @@ -2204,7 +2157,7 @@ do_autovacuum(void) table_endscan(relScan); - /* third pass: check TOAST tables */ + /* second pass: check TOAST tables */ ScanKeyInit(&key, Anum_pg_class_relkind, BTEqualStrategyNumber, F_CHAREQ, @@ -2797,7 +2750,6 @@ extract_autovac_opts(HeapTuple tup, TupleDesc pg_class_desc) Assert(((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_RELATION || ((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_MATVIEW || - ((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_PARTITIONED_TABLE || ((Form_pg_class) GETSTRUCT(tup))->relkind == RELKIND_TOASTVALUE); relopts = extractRelOptions(tup, pg_class_desc, NULL); diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c index ce8888cc300..7fcc3f6ded8 100644 --- a/src/backend/postmaster/pgstat.c +++ b/src/backend/postmaster/pgstat.c @@ -38,7 +38,6 @@ #include "access/transam.h" #include "access/twophase_rmgr.h" #include "access/xact.h" -#include "catalog/partition.h" #include "catalog/pg_database.h" #include "catalog/pg_proc.h" #include "common/ip.h" @@ -345,7 +344,6 @@ static void pgstat_recv_resetreplslotcounter(PgStat_MsgResetreplslotcounter *msg static void pgstat_recv_autovac(PgStat_MsgAutovacStart *msg, int len); static void pgstat_recv_vacuum(PgStat_MsgVacuum *msg, int len); static void pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len); -static void pgstat_recv_anl_ancestors(PgStat_MsgAnlAncestors *msg, int len); static void pgstat_recv_archiver(PgStat_MsgArchiver *msg, int len); static void pgstat_recv_bgwriter(PgStat_MsgBgWriter *msg, int len); static void pgstat_recv_wal(PgStat_MsgWal *msg, int len); @@ -1599,9 +1597,6 @@ pgstat_report_vacuum(Oid tableoid, bool shared, * * Caller must provide new live- and dead-tuples estimates, as well as a * flag indicating whether to reset the changes_since_analyze counter. - * Exceptional support only changes_since_analyze for partitioned tables, - * though they don't have any data. This counter will tell us whether - * partitioned tables need autoanalyze or not. * -------- */ void @@ -1623,31 +1618,21 @@ pgstat_report_analyze(Relation rel, * be double-counted after commit. (This approach also ensures that the * collector ends up with the right numbers if we abort instead of * committing.) - * - * For partitioned tables, we don't report live and dead tuples, because - * such tables don't have any data. */ if (rel->pgstat_info != NULL) { PgStat_TableXactStatus *trans; - if (rel->rd_rel->relkind == RELKIND_PARTITIONED_TABLE) - /* If this rel is partitioned, skip modifying */ - livetuples = deadtuples = 0; - else + for (trans = rel->pgstat_info->trans; trans; trans = trans->upper) { - for (trans = rel->pgstat_info->trans; trans; trans = trans->upper) - { - livetuples -= trans->tuples_inserted - trans->tuples_deleted; - deadtuples -= trans->tuples_updated + trans->tuples_deleted; - } - /* count stuff inserted by already-aborted subxacts, too */ - deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples; - /* Since ANALYZE's counts are estimates, we could have underflowed */ - livetuples = Max(livetuples, 0); - deadtuples = Max(deadtuples, 0); + livetuples -= trans->tuples_inserted - trans->tuples_deleted; + deadtuples -= trans->tuples_updated + trans->tuples_deleted; } - + /* count stuff inserted by already-aborted subxacts, too */ + deadtuples -= rel->pgstat_info->t_counts.t_delta_dead_tuples; + /* Since ANALYZE's counts are estimates, we could have underflowed */ + livetuples = Max(livetuples, 0); + deadtuples = Max(deadtuples, 0); } pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ANALYZE); @@ -1659,48 +1644,6 @@ pgstat_report_analyze(Relation rel, msg.m_live_tuples = livetuples; msg.m_dead_tuples = deadtuples; pgstat_send(&msg, sizeof(msg)); - -} - -/* - * pgstat_report_anl_ancestors - * - * Send list of partitioned table ancestors of the given partition to the - * collector. The collector is in charge of propagating the analyze tuple - * counts from the partition to its ancestors. This is necessary so that - * other processes can decide whether to analyze the partitioned tables. - */ -void -pgstat_report_anl_ancestors(Oid relid) -{ - PgStat_MsgAnlAncestors msg; - List *ancestors; - ListCell *lc; - - pgstat_setheader(&msg.m_hdr, PGSTAT_MTYPE_ANL_ANCESTORS); - msg.m_databaseid = MyDatabaseId; - msg.m_tableoid = relid; - msg.m_nancestors = 0; - - ancestors = get_partition_ancestors(relid); - foreach(lc, ancestors) - { - Oid ancestor = lfirst_oid(lc); - - msg.m_ancestors[msg.m_nancestors] = ancestor; - if (++msg.m_nancestors >= PGSTAT_NUM_ANCESTORENTRIES) - { - pgstat_send(&msg, offsetof(PgStat_MsgAnlAncestors, m_ancestors[0]) + - msg.m_nancestors * sizeof(Oid)); - msg.m_nancestors = 0; - } - } - - if (msg.m_nancestors > 0) - pgstat_send(&msg, offsetof(PgStat_MsgAnlAncestors, m_ancestors[0]) + - msg.m_nancestors * sizeof(Oid)); - - list_free(ancestors); } /* -------- @@ -2039,8 +1982,7 @@ pgstat_initstats(Relation rel) char relkind = rel->rd_rel->relkind; /* We only count stats for things that have storage */ - if (!RELKIND_HAS_STORAGE(relkind) && - relkind != RELKIND_PARTITIONED_TABLE) + if (!RELKIND_HAS_STORAGE(relkind)) { rel->pgstat_info = NULL; return; @@ -3370,10 +3312,6 @@ PgstatCollectorMain(int argc, char *argv[]) pgstat_recv_analyze(&msg.msg_analyze, len); break; - case PGSTAT_MTYPE_ANL_ANCESTORS: - pgstat_recv_anl_ancestors(&msg.msg_anl_ancestors, len); - break; - case PGSTAT_MTYPE_ARCHIVER: pgstat_recv_archiver(&msg.msg_archiver, len); break; @@ -3588,7 +3526,6 @@ pgstat_get_tab_entry(PgStat_StatDBEntry *dbentry, Oid tableoid, bool create) result->n_live_tuples = 0; result->n_dead_tuples = 0; result->changes_since_analyze = 0; - result->changes_since_analyze_reported = 0; result->inserts_since_vacuum = 0; result->blocks_fetched = 0; result->blocks_hit = 0; @@ -4870,7 +4807,6 @@ pgstat_recv_tabstat(PgStat_MsgTabstat *msg, int len) tabentry->n_live_tuples = tabmsg->t_counts.t_delta_live_tuples; tabentry->n_dead_tuples = tabmsg->t_counts.t_delta_dead_tuples; tabentry->changes_since_analyze = tabmsg->t_counts.t_changed_tuples; - tabentry->changes_since_analyze_reported = 0; tabentry->inserts_since_vacuum = tabmsg->t_counts.t_tuples_inserted; tabentry->blocks_fetched = tabmsg->t_counts.t_blocks_fetched; tabentry->blocks_hit = tabmsg->t_counts.t_blocks_hit; @@ -5268,10 +5204,7 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) * have no good way to estimate how many of those there were. */ if (msg->m_resetcounter) - { tabentry->changes_since_analyze = 0; - tabentry->changes_since_analyze_reported = 0; - } if (msg->m_autovacuum) { @@ -5285,29 +5218,6 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len) } } -static void -pgstat_recv_anl_ancestors(PgStat_MsgAnlAncestors *msg, int len) -{ - PgStat_StatDBEntry *dbentry; - PgStat_StatTabEntry *tabentry; - - dbentry = pgstat_get_db_entry(msg->m_databaseid, true); - - tabentry = pgstat_get_tab_entry(dbentry, msg->m_tableoid, true); - - for (int i = 0; i < msg->m_nancestors; i++) - { - Oid ancestor_relid = msg->m_ancestors[i]; - PgStat_StatTabEntry *ancestor; - - ancestor = pgstat_get_tab_entry(dbentry, ancestor_relid, true); - ancestor->changes_since_analyze += - tabentry->changes_since_analyze - tabentry->changes_since_analyze_reported; - } - - tabentry->changes_since_analyze_reported = tabentry->changes_since_analyze; - -} /* ---------- * pgstat_recv_archiver() - diff --git a/src/include/pgstat.h b/src/include/pgstat.h index 9612c0a6c27..f779b48b8c0 100644 --- a/src/include/pgstat.h +++ b/src/include/pgstat.h @@ -69,7 +69,6 @@ typedef enum StatMsgType PGSTAT_MTYPE_AUTOVAC_START, PGSTAT_MTYPE_VACUUM, PGSTAT_MTYPE_ANALYZE, - PGSTAT_MTYPE_ANL_ANCESTORS, PGSTAT_MTYPE_ARCHIVER, PGSTAT_MTYPE_BGWRITER, PGSTAT_MTYPE_WAL, @@ -107,7 +106,7 @@ typedef int64 PgStat_Counter; * * tuples_inserted/updated/deleted/hot_updated count attempted actions, * regardless of whether the transaction committed. delta_live_tuples, - * delta_dead_tuples, changed_tuples are set depending on commit or abort. + * delta_dead_tuples, and changed_tuples are set depending on commit or abort. * Note that delta_live_tuples and delta_dead_tuples can be negative! * ---------- */ @@ -430,25 +429,6 @@ typedef struct PgStat_MsgAnalyze PgStat_Counter m_dead_tuples; } PgStat_MsgAnalyze; -/* ---------- - * PgStat_MsgAnlAncestors Sent by the backend or autovacuum daemon - * to inform partitioned tables that are - * ancestors of a partition, to propagate - * analyze counters - * ---------- - */ -#define PGSTAT_NUM_ANCESTORENTRIES \ - ((PGSTAT_MSG_PAYLOAD - sizeof(Oid) - sizeof(Oid) - sizeof(int)) \ - / sizeof(Oid)) - -typedef struct PgStat_MsgAnlAncestors -{ - PgStat_MsgHdr m_hdr; - Oid m_databaseid; - Oid m_tableoid; - int m_nancestors; - Oid m_ancestors[PGSTAT_NUM_ANCESTORENTRIES]; -} PgStat_MsgAnlAncestors; /* ---------- * PgStat_MsgArchiver Sent by the archiver to update statistics. @@ -697,7 +677,6 @@ typedef union PgStat_Msg PgStat_MsgAutovacStart msg_autovacuum_start; PgStat_MsgVacuum msg_vacuum; PgStat_MsgAnalyze msg_analyze; - PgStat_MsgAnlAncestors msg_anl_ancestors; PgStat_MsgArchiver msg_archiver; PgStat_MsgBgWriter msg_bgwriter; PgStat_MsgWal msg_wal; @@ -793,7 +772,7 @@ typedef struct PgStat_StatTabEntry PgStat_Counter n_live_tuples; PgStat_Counter n_dead_tuples; PgStat_Counter changes_since_analyze; - PgStat_Counter changes_since_analyze_reported; + PgStat_Counter unused_counter; /* kept for ABI compatibility */ PgStat_Counter inserts_since_vacuum; PgStat_Counter blocks_fetched; @@ -1002,7 +981,6 @@ extern void pgstat_report_vacuum(Oid tableoid, bool shared, extern void pgstat_report_analyze(Relation rel, PgStat_Counter livetuples, PgStat_Counter deadtuples, bool resetcounter); -extern void pgstat_report_anl_ancestors(Oid relid); extern void pgstat_report_recovery_conflict(int reason); extern void pgstat_report_deadlock(void);