aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/commands/analyze.c7
-rw-r--r--src/backend/postmaster/pgstat.c15
-rw-r--r--src/include/pgstat.h4
3 files changed, 19 insertions, 7 deletions
diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index cf8c8164b7e..97059e59c82 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -611,10 +611,13 @@ do_analyze_rel(Relation onerel, int options, VacuumParams *params,
/*
* Report ANALYZE to the stats collector, too. However, if doing
* inherited stats we shouldn't report, because the stats collector only
- * tracks per-table stats.
+ * 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.
*/
if (!inh)
- pgstat_report_analyze(onerel, totalrows, totaldeadrows);
+ pgstat_report_analyze(onerel, totalrows, totaldeadrows,
+ (va_cols == NIL));
/* If this isn't part of VACUUM ANALYZE, let index AMs do cleanup */
if (!(options & VACOPT_VACUUM))
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index 44237f952e2..d655fbcd835 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -1340,11 +1340,15 @@ pgstat_report_vacuum(Oid tableoid, bool shared,
* pgstat_report_analyze() -
*
* Tell the collector about the table we just analyzed.
+ *
+ * Caller must provide new live- and dead-tuples estimates, as well as a
+ * flag indicating whether to reset the changes_since_analyze counter.
* --------
*/
void
pgstat_report_analyze(Relation rel,
- PgStat_Counter livetuples, PgStat_Counter deadtuples)
+ PgStat_Counter livetuples, PgStat_Counter deadtuples,
+ bool resetcounter)
{
PgStat_MsgAnalyze msg;
@@ -1381,6 +1385,7 @@ pgstat_report_analyze(Relation rel,
msg.m_databaseid = rel->rd_rel->relisshared ? InvalidOid : MyDatabaseId;
msg.m_tableoid = RelationGetRelid(rel);
msg.m_autovacuum = IsAutoVacuumWorkerProcess();
+ msg.m_resetcounter = resetcounter;
msg.m_analyzetime = GetCurrentTimestamp();
msg.m_live_tuples = livetuples;
msg.m_dead_tuples = deadtuples;
@@ -5263,10 +5268,12 @@ pgstat_recv_analyze(PgStat_MsgAnalyze *msg, int len)
tabentry->n_dead_tuples = msg->m_dead_tuples;
/*
- * We reset changes_since_analyze to zero, forgetting any changes that
- * occurred while the ANALYZE was in progress.
+ * If commanded, reset changes_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.
*/
- tabentry->changes_since_analyze = 0;
+ if (msg->m_resetcounter)
+ tabentry->changes_since_analyze = 0;
if (msg->m_autovacuum)
{
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index a078b61060e..19c838771f9 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -383,6 +383,7 @@ typedef struct PgStat_MsgAnalyze
Oid m_databaseid;
Oid m_tableoid;
bool m_autovacuum;
+ bool m_resetcounter;
TimestampTz m_analyzetime;
PgStat_Counter m_live_tuples;
PgStat_Counter m_dead_tuples;
@@ -970,7 +971,8 @@ extern void pgstat_report_autovac(Oid dboid);
extern void pgstat_report_vacuum(Oid tableoid, bool shared,
PgStat_Counter livetuples, PgStat_Counter deadtuples);
extern void pgstat_report_analyze(Relation rel,
- PgStat_Counter livetuples, PgStat_Counter deadtuples);
+ PgStat_Counter livetuples, PgStat_Counter deadtuples,
+ bool resetcounter);
extern void pgstat_report_recovery_conflict(int reason);
extern void pgstat_report_deadlock(void);