diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2014-01-18 19:24:20 -0500 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2014-01-18 19:24:33 -0500 |
commit | 115f414124e71749d2d8f512e469ca63bc2166e5 (patch) | |
tree | ab361085d44a3491bc034041470a2fab1c644e92 /src/backend/commands | |
parent | 76e91b38ba64e1da70ea21744b342cb105ea3400 (diff) | |
download | postgresql-115f414124e71749d2d8f512e469ca63bc2166e5.tar.gz postgresql-115f414124e71749d2d8f512e469ca63bc2166e5.zip |
Fix VACUUM's reporting of dead-tuple counts to the stats collector.
Historically, VACUUM has just reported its new_rel_tuples estimate
(the same thing it puts into pg_class.reltuples) to the stats collector.
That number counts both live and dead-but-not-yet-reclaimable tuples.
This behavior may once have been right, but modern versions of the
pgstats code track live and dead tuple counts separately, so putting
the total into n_live_tuples and zero into n_dead_tuples is surely
pretty bogus. Fix it to report live and dead tuple counts separately.
This doesn't really do much for situations where updating transactions
commit concurrently with a VACUUM scan (possibly causing double-counting or
omission of the tuples they add or delete); but it's clearly an improvement
over what we were doing before.
Hari Babu, reviewed by Amit Kapila
Diffstat (limited to 'src/backend/commands')
-rw-r--r-- | src/backend/commands/vacuumlazy.c | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index e0000e6be32..75e5f157eaa 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -106,6 +106,7 @@ typedef struct LVRelStats double scanned_tuples; /* counts only tuples on scanned pages */ double old_rel_tuples; /* previous value of pg_class.reltuples */ double new_rel_tuples; /* new estimated total # of tuples */ + double new_dead_tuples; /* new estimated total # of dead tuples */ BlockNumber pages_removed; double tuples_deleted; BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */ @@ -185,6 +186,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt, BlockNumber new_rel_pages; double new_rel_tuples; BlockNumber new_rel_allvisible; + double new_live_tuples; TransactionId new_frozen_xid; MultiXactId new_min_multi; @@ -307,9 +309,14 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt, new_min_multi); /* report results to the stats collector, too */ + new_live_tuples = new_rel_tuples - vacrelstats->new_dead_tuples; + if (new_live_tuples < 0) + new_live_tuples = 0; /* just in case */ + pgstat_report_vacuum(RelationGetRelid(onerel), onerel->rd_rel->relisshared, - new_rel_tuples); + new_live_tuples, + vacrelstats->new_dead_tuples); /* and log the action if appropriate */ if (IsAutoVacuumWorkerProcess() && Log_autovacuum_min_duration >= 0) @@ -334,7 +341,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt, ereport(LOG, (errmsg("automatic vacuum of table \"%s.%s.%s\": index scans: %d\n" "pages: %d removed, %d remain\n" - "tuples: %.0f removed, %.0f remain\n" + "tuples: %.0f removed, %.0f remain, %.0f are dead but not yet removable\n" "buffer usage: %d hits, %d misses, %d dirtied\n" "avg read rate: %.3f MB/s, avg write rate: %.3f MB/s\n" "system usage: %s", @@ -346,6 +353,7 @@ lazy_vacuum_rel(Relation onerel, VacuumStmt *vacstmt, vacrelstats->rel_pages, vacrelstats->tuples_deleted, vacrelstats->new_rel_tuples, + vacrelstats->new_dead_tuples, VacuumPageHit, VacuumPageMiss, VacuumPageDirty, @@ -1036,6 +1044,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, /* save stats for use later */ vacrelstats->scanned_tuples = num_tuples; vacrelstats->tuples_deleted = tups_vacuumed; + vacrelstats->new_dead_tuples = nkeep; /* now we can compute the new value for pg_class.reltuples */ vacrelstats->new_rel_tuples = vac_estimate_reltuples(onerel, false, |