@@ -198,6 +198,7 @@ typedef struct LVRelState
198
198
BlockNumber rel_pages ; /* total number of pages */
199
199
BlockNumber scanned_pages ; /* # pages examined (not skipped via VM) */
200
200
BlockNumber removed_pages ; /* # pages removed by relation truncation */
201
+ BlockNumber frozen_pages ; /* # pages with newly frozen tuples */
201
202
BlockNumber lpdead_item_pages ; /* # pages with LP_DEAD items */
202
203
BlockNumber missed_dead_pages ; /* # pages with missed dead tuples */
203
204
BlockNumber nonempty_pages ; /* actually, last nonempty page + 1 */
@@ -212,6 +213,7 @@ typedef struct LVRelState
212
213
int num_index_scans ;
213
214
/* Counters that follow are only for scanned_pages */
214
215
int64 tuples_deleted ; /* # deleted from table */
216
+ int64 tuples_frozen ; /* # newly frozen */
215
217
int64 lpdead_items ; /* # deleted from indexes */
216
218
int64 live_tuples ; /* # live tuples remaining */
217
219
int64 recently_dead_tuples ; /* # dead, but not yet removable */
@@ -470,6 +472,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
470
472
/* Initialize page counters explicitly (be tidy) */
471
473
vacrel -> scanned_pages = 0 ;
472
474
vacrel -> removed_pages = 0 ;
475
+ vacrel -> frozen_pages = 0 ;
473
476
vacrel -> lpdead_item_pages = 0 ;
474
477
vacrel -> missed_dead_pages = 0 ;
475
478
vacrel -> nonempty_pages = 0 ;
@@ -484,6 +487,7 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
484
487
/* Initialize remaining counters (be tidy) */
485
488
vacrel -> num_index_scans = 0 ;
486
489
vacrel -> tuples_deleted = 0 ;
490
+ vacrel -> tuples_frozen = 0 ;
487
491
vacrel -> lpdead_items = 0 ;
488
492
vacrel -> live_tuples = 0 ;
489
493
vacrel -> recently_dead_tuples = 0 ;
@@ -721,6 +725,11 @@ heap_vacuum_rel(Relation rel, VacuumParams *params,
721
725
_ ("new relminmxid: %u, which is %d MXIDs ahead of previous value\n" ),
722
726
vacrel -> NewRelminMxid , diff );
723
727
}
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 );
724
733
if (vacrel -> do_index_vacuuming )
725
734
{
726
735
if (vacrel -> nindexes == 0 || vacrel -> num_index_scans == 0 )
@@ -1549,11 +1558,11 @@ lazy_scan_prune(LVRelState *vacrel,
1549
1558
HeapTupleData tuple ;
1550
1559
HTSV_Result res ;
1551
1560
int tuples_deleted ,
1561
+ tuples_frozen ,
1552
1562
lpdead_items ,
1553
1563
live_tuples ,
1554
1564
recently_dead_tuples ;
1555
1565
int nnewlpdead ;
1556
- int nfrozen ;
1557
1566
TransactionId NewRelfrozenXid ;
1558
1567
MultiXactId NewRelminMxid ;
1559
1568
OffsetNumber deadoffsets [MaxHeapTuplesPerPage ];
@@ -1574,6 +1583,7 @@ lazy_scan_prune(LVRelState *vacrel,
1574
1583
NewRelfrozenXid = vacrel -> NewRelfrozenXid ;
1575
1584
NewRelminMxid = vacrel -> NewRelminMxid ;
1576
1585
tuples_deleted = 0 ;
1586
+ tuples_frozen = 0 ;
1577
1587
lpdead_items = 0 ;
1578
1588
live_tuples = 0 ;
1579
1589
recently_dead_tuples = 0 ;
@@ -1600,7 +1610,6 @@ lazy_scan_prune(LVRelState *vacrel,
1600
1610
prunestate -> all_visible = true;
1601
1611
prunestate -> all_frozen = true;
1602
1612
prunestate -> visibility_cutoff_xid = InvalidTransactionId ;
1603
- nfrozen = 0 ;
1604
1613
1605
1614
for (offnum = FirstOffsetNumber ;
1606
1615
offnum <= maxoff ;
@@ -1779,11 +1788,12 @@ lazy_scan_prune(LVRelState *vacrel,
1779
1788
vacrel -> relminmxid ,
1780
1789
vacrel -> FreezeLimit ,
1781
1790
vacrel -> MultiXactCutoff ,
1782
- & frozen [nfrozen ], & tuple_totally_frozen ,
1791
+ & frozen [tuples_frozen ],
1792
+ & tuple_totally_frozen ,
1783
1793
& NewRelfrozenXid , & NewRelminMxid ))
1784
1794
{
1785
1795
/* Will execute freeze below */
1786
- frozen [nfrozen ++ ].offset = offnum ;
1796
+ frozen [tuples_frozen ++ ].offset = offnum ;
1787
1797
}
1788
1798
1789
1799
/*
@@ -1809,10 +1819,12 @@ lazy_scan_prune(LVRelState *vacrel,
1809
1819
* Consider the need to freeze any items with tuple storage from the page
1810
1820
* first (arbitrary)
1811
1821
*/
1812
- if (nfrozen > 0 )
1822
+ if (tuples_frozen > 0 )
1813
1823
{
1814
1824
Assert (prunestate -> hastup );
1815
1825
1826
+ vacrel -> frozen_pages ++ ;
1827
+
1816
1828
/*
1817
1829
* At least one tuple with storage needs to be frozen -- execute that
1818
1830
* now.
@@ -1826,7 +1838,7 @@ lazy_scan_prune(LVRelState *vacrel,
1826
1838
MarkBufferDirty (buf );
1827
1839
1828
1840
/* execute collected freezes */
1829
- for (int i = 0 ; i < nfrozen ; i ++ )
1841
+ for (int i = 0 ; i < tuples_frozen ; i ++ )
1830
1842
{
1831
1843
HeapTupleHeader htup ;
1832
1844
@@ -1842,7 +1854,7 @@ lazy_scan_prune(LVRelState *vacrel,
1842
1854
XLogRecPtr recptr ;
1843
1855
1844
1856
recptr = log_heap_freeze (vacrel -> rel , buf , vacrel -> FreezeLimit ,
1845
- frozen , nfrozen );
1857
+ frozen , tuples_frozen );
1846
1858
PageSetLSN (page , recptr );
1847
1859
}
1848
1860
@@ -1914,6 +1926,7 @@ lazy_scan_prune(LVRelState *vacrel,
1914
1926
1915
1927
/* Finally, add page-local counts to whole-VACUUM counts */
1916
1928
vacrel -> tuples_deleted += tuples_deleted ;
1929
+ vacrel -> tuples_frozen += tuples_frozen ;
1917
1930
vacrel -> lpdead_items += lpdead_items ;
1918
1931
vacrel -> live_tuples += live_tuples ;
1919
1932
vacrel -> recently_dead_tuples += recently_dead_tuples ;
0 commit comments