@@ -198,6 +198,7 @@ typedef struct LVRelState
198198 BlockNumber rel_pages ; /* total number of pages */
199199 BlockNumber scanned_pages ; /* # pages examined (not skipped via VM) */
200200 BlockNumber removed_pages ; /* # pages removed by relation truncation */
201+ BlockNumber frozen_pages ; /* # pages with newly frozen tuples */
201202 BlockNumber lpdead_item_pages ; /* # pages with LP_DEAD items */
202203 BlockNumber missed_dead_pages ; /* # pages with missed dead tuples */
203204 BlockNumber nonempty_pages ; /* actually, last nonempty page + 1 */
@@ -212,6 +213,7 @@ typedef struct LVRelState
212213 int num_index_scans ;
213214 /* Counters that follow are only for scanned_pages */
214215 int64 tuples_deleted ; /* # deleted from table */
216+ int64 tuples_frozen ; /* # newly frozen */
215217 int64 lpdead_items ; /* # deleted from indexes */
216218 int64 live_tuples ; /* # live tuples remaining */
217219 int64 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) */
471473 vacrel -> scanned_pages = 0 ;
472474 vacrel -> removed_pages = 0 ;
475+ vacrel -> frozen_pages = 0 ;
473476 vacrel -> lpdead_item_pages = 0 ;
474477 vacrel -> missed_dead_pages = 0 ;
475478 vacrel -> nonempty_pages = 0 ;
@@ -484,6 +487,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
484487 /* Initialize remaining counters (be tidy) */
485488 vacrel -> num_index_scans = 0 ;
486489 vacrel -> tuples_deleted = 0 ;
490+ vacrel -> tuples_frozen = 0 ;
487491 vacrel -> lpdead_items = 0 ;
488492 vacrel -> live_tuples = 0 ;
489493 vacrel -> 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" ),
722726 vacrel -> 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 );
724733 if (vacrel -> do_index_vacuuming )
725734 {
726735 if (vacrel -> nindexes == 0 || vacrel -> num_index_scans == 0 )
@@ -1549,11 +1558,11 @@ lazy_scan_prune(LVRelState *vacrel,
15491558 HeapTupleData tuple ;
15501559 HTSV_Result res ;
15511560 int tuples_deleted ,
1561+ tuples_frozen ,
15521562 lpdead_items ,
15531563 live_tuples ,
15541564 recently_dead_tuples ;
15551565 int nnewlpdead ;
1556- int nfrozen ;
15571566 TransactionId NewRelfrozenXid ;
15581567 MultiXactId NewRelminMxid ;
15591568 OffsetNumber deadoffsets [MaxHeapTuplesPerPage ];
@@ -1574,6 +1583,7 @@ lazy_scan_prune(LVRelState *vacrel,
15741583 NewRelfrozenXid = vacrel -> NewRelfrozenXid ;
15751584 NewRelminMxid = vacrel -> NewRelminMxid ;
15761585 tuples_deleted = 0 ;
1586+ tuples_frozen = 0 ;
15771587 lpdead_items = 0 ;
15781588 live_tuples = 0 ;
15791589 recently_dead_tuples = 0 ;
@@ -1600,7 +1610,6 @@ lazy_scan_prune(LVRelState *vacrel,
16001610 prunestate -> all_visible = true;
16011611 prunestate -> all_frozen = true;
16021612 prunestate -> visibility_cutoff_xid = InvalidTransactionId ;
1603- nfrozen = 0 ;
16041613
16051614 for (offnum = FirstOffsetNumber ;
16061615 offnum <= maxoff ;
@@ -1779,11 +1788,12 @@ lazy_scan_prune(LVRelState *vacrel,
17791788 vacrel -> relminmxid ,
17801789 vacrel -> FreezeLimit ,
17811790 vacrel -> 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 {
18141824 Assert (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,
18261838 MarkBufferDirty (buf );
18271839
18281840 /* execute collected freezes */
1829- for (int i = 0 ; i < nfrozen ; i ++ )
1841+ for (int i = 0 ; i < tuples_frozen ; i ++ )
18301842 {
18311843 HeapTupleHeader htup ;
18321844
@@ -1842,7 +1854,7 @@ lazy_scan_prune(LVRelState *vacrel,
18421854 XLogRecPtr recptr ;
18431855
18441856 recptr = log_heap_freeze (vacrel -> rel , buf , vacrel -> FreezeLimit ,
1845- frozen , nfrozen );
1857+ frozen , tuples_frozen );
18461858 PageSetLSN (page , recptr );
18471859 }
18481860
@@ -1914,6 +1926,7 @@ lazy_scan_prune(LVRelState *vacrel,
19141926
19151927 /* Finally, add page-local counts to whole-VACUUM counts */
19161928 vacrel -> tuples_deleted += tuples_deleted ;
1929+ vacrel -> tuples_frozen += tuples_frozen ;
19171930 vacrel -> lpdead_items += lpdead_items ;
19181931 vacrel -> live_tuples += live_tuples ;
19191932 vacrel -> recently_dead_tuples += recently_dead_tuples ;
0 commit comments