diff --git a/src/backend/access/heap/vacuumlazy.c b/src/backend/access/heap/vacuumlazy.c index 826db728418..ef2c72edf5d 100644 --- a/src/backend/access/heap/vacuumlazy.c +++ b/src/backend/access/heap/vacuumlazy.c @@ -347,8 +347,8 @@ typedef struct LVRelState /* Instrumentation counters */ int num_index_scans; - int num_dead_items_resets; /* # times dead_items was reset */ - Size total_dead_items_bytes; /* # total memory usage for dead_items */ + int num_dead_items_resets; + Size total_dead_items_bytes; /* Counters that follow are only for scanned_pages */ int64 tuples_deleted; /* # deleted from table */ int64 tuples_frozen; /* # newly frozen */ @@ -647,7 +647,7 @@ heap_vacuum_rel(Relation rel, const VacuumParams params, BufferUsage startbufferusage = pgBufferUsage; ErrorContextCallback errcallback; char **indnames = NULL; - Size dead_items_max_bytes = 0; /* # save max_bytes before cleanup */ + Size dead_items_max_bytes = 0; verbose = (params.options & VACOPT_VERBOSE) != 0; instrument = (verbose || (AmAutoVacuumWorkerProcess() && @@ -762,14 +762,14 @@ heap_vacuum_rel(Relation rel, const VacuumParams params, /* Initialize remaining counters (be tidy) */ vacrel->num_index_scans = 0; + vacrel->num_dead_items_resets = 0; + vacrel->total_dead_items_bytes = 0; vacrel->tuples_deleted = 0; vacrel->tuples_frozen = 0; vacrel->lpdead_items = 0; vacrel->live_tuples = 0; vacrel->recently_dead_tuples = 0; vacrel->missed_dead_tuples = 0; - vacrel->total_dead_items_bytes = 0; - vacrel->num_dead_items_resets = 0; vacrel->vm_new_visible_pages = 0; vacrel->vm_new_visible_frozen_pages = 0; @@ -849,18 +849,19 @@ heap_vacuum_rel(Relation rel, const VacuumParams params, lazy_check_wraparound_failsafe(vacrel); dead_items_alloc(vacrel, params.nworkers); - /* - * Save max_bytes before cleanup, as dead_items_info may be freed in - * parallel mode during dead_items_cleanup(). - */ - dead_items_max_bytes = vacrel->dead_items_info->max_bytes; - /* * Call lazy_scan_heap to perform all required heap pruning, index * vacuuming, and heap vacuuming (plus related processing) */ lazy_scan_heap(vacrel); + /* + * Save dead items max_bytes before cleanup for reporting the memory usage + * as the dead_items_info is freed in parallel vacuum cases during + * cleanup. + */ + dead_items_max_bytes = vacrel->dead_items_info->max_bytes; + /* * Free resources managed by dead_items_alloc. This ends parallel mode in * passing when necessary. @@ -1165,19 +1166,23 @@ heap_vacuum_rel(Relation rel, const VacuumParams params, walusage.wal_bytes, walusage.wal_fpi_bytes, walusage.wal_buffers_full); + /* - * Report memory usage for dead_items tracking. - * Note: num_dead_items_resets includes the final reset that occurs - * at the end of vacuum, so the count represents all resets including - * the last one. + * Report the dead-items memory usage. + * + * The num_dead_items_resets counter increases when we collect + * enough dead items to trigger index vacuuming, either because + * we've run out of available space or reached the end of the + * table. Note that this counter may be non-zero even when index + * vacuuming is disabled. */ appendStringInfo(&buf, - ngettext("memory usage: %.2f MB in total, with dead-item storage reset %d time (limit was %.2f MB)\n", - "memory usage: %.2f MB in total, with dead-item storage reset %d times (limit was %.2f MB)\n", - vacrel->num_dead_items_resets), - (double) vacrel->total_dead_items_bytes / (1024.0 * 1024.0), - vacrel->num_dead_items_resets, - (double) dead_items_max_bytes / (1024.0 * 1024.0)); + ngettext("memory usage: %.2f MB in total, with dead-item storage reset %d time (limit was %.2f MB)\n", + "memory usage: %.2f MB in total, with dead-item storage reset %d times (limit was %.2f MB)\n", + vacrel->num_dead_items_resets), + (double) vacrel->total_dead_items_bytes / (1024 * 1024), + vacrel->num_dead_items_resets, + (double) dead_items_max_bytes / (1024 * 1024)); appendStringInfo(&buf, _("system usage: %s"), pg_rusage_show(&ru0)); ereport(verbose ? INFO : LOG, @@ -3627,10 +3632,8 @@ dead_items_add(LVRelState *vacrel, BlockNumber blkno, OffsetNumber *offsets, static void dead_items_reset(LVRelState *vacrel) { - /* Increment dead_items reset counter */ + /* Update statistics for dead items */ vacrel->num_dead_items_resets++; - - /* Track total memory usage for dead_items */ vacrel->total_dead_items_bytes += TidStoreMemoryUsage(vacrel->dead_items); if (ParallelVacuumIsActive(vacrel))