BlockNumber rel_pages; /* total number of pages */
BlockNumber scanned_pages; /* # pages examined (not skipped via VM) */
BlockNumber removed_pages; /* # pages removed by relation truncation */
+ BlockNumber frozen_pages; /* # pages with newly frozen tuples */
BlockNumber lpdead_item_pages; /* # pages with LP_DEAD items */
BlockNumber missed_dead_pages; /* # pages with missed dead tuples */
BlockNumber nonempty_pages; /* actually, last nonempty page + 1 */
int num_index_scans;
/* Counters that follow are only for scanned_pages */
int64 tuples_deleted; /* # deleted from table */
+ int64 tuples_frozen; /* # newly frozen */
int64 lpdead_items; /* # deleted from indexes */
int64 live_tuples; /* # live tuples remaining */
int64 recently_dead_tuples; /* # dead, but not yet removable */
/* Initialize page counters explicitly (be tidy) */
vacrel->scanned_pages = 0;
vacrel->removed_pages = 0;
+ vacrel->frozen_pages = 0;
vacrel->lpdead_item_pages = 0;
vacrel->missed_dead_pages = 0;
vacrel->nonempty_pages = 0;
/* Initialize remaining counters (be tidy) */
vacrel->num_index_scans = 0;
vacrel->tuples_deleted = 0;
+ vacrel->tuples_frozen = 0;
vacrel->lpdead_items = 0;
vacrel->live_tuples = 0;
vacrel->recently_dead_tuples = 0;
_("new relminmxid: %u, which is %d MXIDs ahead of previous value\n"),
vacrel->NewRelminMxid, diff);
}
+ appendStringInfo(&buf, _("frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n"),
+ vacrel->frozen_pages,
+ orig_rel_pages == 0 ? 100.0 :
+ 100.0 * vacrel->frozen_pages / orig_rel_pages,
+ (long long) vacrel->tuples_frozen);
if (vacrel->do_index_vacuuming)
{
if (vacrel->nindexes == 0 || vacrel->num_index_scans == 0)
HeapTupleData tuple;
HTSV_Result res;
int tuples_deleted,
+ tuples_frozen,
lpdead_items,
live_tuples,
recently_dead_tuples;
int nnewlpdead;
- int nfrozen;
TransactionId NewRelfrozenXid;
MultiXactId NewRelminMxid;
OffsetNumber deadoffsets[MaxHeapTuplesPerPage];
NewRelfrozenXid = vacrel->NewRelfrozenXid;
NewRelminMxid = vacrel->NewRelminMxid;
tuples_deleted = 0;
+ tuples_frozen = 0;
lpdead_items = 0;
live_tuples = 0;
recently_dead_tuples = 0;
prunestate->all_visible = true;
prunestate->all_frozen = true;
prunestate->visibility_cutoff_xid = InvalidTransactionId;
- nfrozen = 0;
for (offnum = FirstOffsetNumber;
offnum <= maxoff;
vacrel->relminmxid,
vacrel->FreezeLimit,
vacrel->MultiXactCutoff,
- &frozen[nfrozen], &tuple_totally_frozen,
+ &frozen[tuples_frozen],
+ &tuple_totally_frozen,
&NewRelfrozenXid, &NewRelminMxid))
{
/* Will execute freeze below */
- frozen[nfrozen++].offset = offnum;
+ frozen[tuples_frozen++].offset = offnum;
}
/*
* Consider the need to freeze any items with tuple storage from the page
* first (arbitrary)
*/
- if (nfrozen > 0)
+ if (tuples_frozen > 0)
{
Assert(prunestate->hastup);
+ vacrel->frozen_pages++;
+
/*
* At least one tuple with storage needs to be frozen -- execute that
* now.
MarkBufferDirty(buf);
/* execute collected freezes */
- for (int i = 0; i < nfrozen; i++)
+ for (int i = 0; i < tuples_frozen; i++)
{
HeapTupleHeader htup;
XLogRecPtr recptr;
recptr = log_heap_freeze(vacrel->rel, buf, vacrel->FreezeLimit,
- frozen, nfrozen);
+ frozen, tuples_frozen);
PageSetLSN(page, recptr);
}
/* Finally, add page-local counts to whole-VACUUM counts */
vacrel->tuples_deleted += tuples_deleted;
+ vacrel->tuples_frozen += tuples_frozen;
vacrel->lpdead_items += lpdead_items;
vacrel->live_tuples += live_tuples;
vacrel->recently_dead_tuples += recently_dead_tuples;