@@ -198,6 +198,7 @@ typedef struct LVRelState
198198BlockNumber rel_pages ;/* total number of pages */
199199BlockNumber scanned_pages ;/* # pages examined (not skipped via VM) */
200200BlockNumber removed_pages ;/* # pages removed by relation truncation */
201+ BlockNumber frozen_pages ;/* # pages with newly frozen tuples */
201202BlockNumber lpdead_item_pages ;/* # pages with LP_DEAD items */
202203BlockNumber missed_dead_pages ;/* # pages with missed dead tuples */
203204BlockNumber nonempty_pages ;/* actually, last nonempty page + 1 */
@@ -212,6 +213,7 @@ typedef struct LVRelState
212213int num_index_scans ;
213214/* Counters that follow are only for scanned_pages */
214215int64 tuples_deleted ;/* # deleted from table */
216+ int64 tuples_frozen ;/* # newly frozen */
215217int64 lpdead_items ;/* # deleted from indexes */
216218int64 live_tuples ;/* # live tuples remaining */
217219int64 recently_dead_tuples ;/* # dead, but not yet removable */
@@ -470,6 +472,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
470472/* Initialize page counters explicitly (be tidy) */
471473vacrel -> scanned_pages = 0 ;
472474vacrel -> removed_pages = 0 ;
475+ vacrel -> frozen_pages = 0 ;
473476vacrel -> lpdead_item_pages = 0 ;
474477vacrel -> missed_dead_pages = 0 ;
475478vacrel -> nonempty_pages = 0 ;
@@ -484,6 +487,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
484487/* Initialize remaining counters (be tidy) */
485488vacrel -> num_index_scans = 0 ;
486489vacrel -> tuples_deleted = 0 ;
490+ vacrel -> tuples_frozen = 0 ;
487491vacrel -> lpdead_items = 0 ;
488492vacrel -> live_tuples = 0 ;
489493vacrel -> recently_dead_tuples = 0 ;
@@ -721,6 +725,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
721725_ ("new relminmxid: %u, which is %d MXIDs ahead of previous value\n" ),
722726vacrel -> NewRelminMxid ,diff );
723727}
728+ appendStringInfo (& buf ,_ ("frozen: %u pages from table (%.2f%% of total) had %lld tuples frozen\n" ),
729+ vacrel -> frozen_pages ,
730+ orig_rel_pages == 0 ?100.0 :
731+ 100.0 * vacrel -> frozen_pages /orig_rel_pages ,
732+ (long long )vacrel -> tuples_frozen );
724733if (vacrel -> do_index_vacuuming )
725734{
726735if (vacrel -> nindexes == 0 || vacrel -> num_index_scans == 0 )
@@ -1549,11 +1558,11 @@ lazy_scan_prune(LVRelState *vacrel,
15491558HeapTupleData tuple ;
15501559HTSV_Result res ;
15511560int tuples_deleted ,
1561+ tuples_frozen ,
15521562lpdead_items ,
15531563live_tuples ,
15541564recently_dead_tuples ;
15551565int nnewlpdead ;
1556- int nfrozen ;
15571566TransactionId NewRelfrozenXid ;
15581567MultiXactId NewRelminMxid ;
15591568OffsetNumber deadoffsets [MaxHeapTuplesPerPage ];
@@ -1574,6 +1583,7 @@ lazy_scan_prune(LVRelState *vacrel,
15741583NewRelfrozenXid = vacrel -> NewRelfrozenXid ;
15751584NewRelminMxid = vacrel -> NewRelminMxid ;
15761585tuples_deleted = 0 ;
1586+ tuples_frozen = 0 ;
15771587lpdead_items = 0 ;
15781588live_tuples = 0 ;
15791589recently_dead_tuples = 0 ;
@@ -1600,7 +1610,6 @@ lazy_scan_prune(LVRelState *vacrel,
16001610prunestate -> all_visible = true;
16011611prunestate -> all_frozen = true;
16021612prunestate -> visibility_cutoff_xid = InvalidTransactionId ;
1603- nfrozen = 0 ;
16041613
16051614for (offnum = FirstOffsetNumber ;
16061615offnum <=maxoff ;
@@ -1779,11 +1788,12 @@ lazy_scan_prune(LVRelState *vacrel,
17791788vacrel -> relminmxid ,
17801789vacrel -> FreezeLimit ,
17811790vacrel -> MultiXactCutoff ,
1782- & frozen [nfrozen ],& tuple_totally_frozen ,
1791+ & frozen [tuples_frozen ],
1792+ & tuple_totally_frozen ,
17831793& NewRelfrozenXid ,& NewRelminMxid ))
17841794{
17851795/* Will execute freeze below */
1786- frozen [nfrozen ++ ].offset = offnum ;
1796+ frozen [tuples_frozen ++ ].offset = offnum ;
17871797}
17881798
17891799/*
@@ -1809,10 +1819,12 @@ lazy_scan_prune(LVRelState *vacrel,
18091819 * Consider the need to freeze any items with tuple storage from the page
18101820 * first (arbitrary)
18111821 */
1812- if (nfrozen > 0 )
1822+ if (tuples_frozen > 0 )
18131823{
18141824Assert (prunestate -> hastup );
18151825
1826+ vacrel -> frozen_pages ++ ;
1827+
18161828/*
18171829 * At least one tuple with storage needs to be frozen -- execute that
18181830 * now.
@@ -1826,7 +1838,7 @@ lazy_scan_prune(LVRelState *vacrel,
18261838MarkBufferDirty (buf );
18271839
18281840/* execute collected freezes */
1829- for (int i = 0 ;i < nfrozen ;i ++ )
1841+ for (int i = 0 ;i < tuples_frozen ;i ++ )
18301842{
18311843HeapTupleHeader htup ;
18321844
@@ -1842,7 +1854,7 @@ lazy_scan_prune(LVRelState *vacrel,
18421854XLogRecPtr recptr ;
18431855
18441856recptr = log_heap_freeze (vacrel -> rel ,buf ,vacrel -> FreezeLimit ,
1845- frozen ,nfrozen );
1857+ frozen ,tuples_frozen );
18461858PageSetLSN (page ,recptr );
18471859}
18481860
@@ -1914,6 +1926,7 @@ lazy_scan_prune(LVRelState *vacrel,
19141926
19151927/* Finally, add page-local counts to whole-VACUUM counts */
19161928vacrel -> tuples_deleted += tuples_deleted ;
1929+ vacrel -> tuples_frozen += tuples_frozen ;
19171930vacrel -> lpdead_items += lpdead_items ;
19181931vacrel -> live_tuples += live_tuples ;
19191932vacrel -> recently_dead_tuples += recently_dead_tuples ;