]> git.ipfire.org Git - thirdparty/postgresql.git/commitdiff
Remove table_scan_analyze_next_tuple unneeded parameter OldestXmin
authorMelanie Plageman <melanieplageman@gmail.com>
Thu, 26 Feb 2026 20:35:32 +0000 (15:35 -0500)
committerMelanie Plageman <melanieplageman@gmail.com>
Thu, 26 Feb 2026 20:41:53 +0000 (15:41 -0500)
heapam_scan_analyze_next_tuple() doesn't distinguish between dead and
recently dead tuples when counting them, so it doesn't need OldestXmin.
GetOldestNonRemovableTransactionId() isn't free, so removing it is a
win.

Looking at other table AMs implementing table_scan_analyze_next_tuple(),
we couldn't find one using OldestXmin either, so remove it from the
callback.

Author: Melanie Plageman <melanieplageman@gmail.com>
Suggested-by: Kirill Reshke <reshkekirill@gmail.com>
Reviewed-by: Kirill Reshke <reshkekirill@gmail.com>
Reviewed-by: Andres Freund <andres@anarazel.de>
Reviewed-by: Chao Li <li.evan.chao@gmail.com>
Discussion: https://postgr.es/m/CALdSSPjvhGXihT_9f-GJabYU%3D_PjrFDUxYaURuTbfLyQM6TErg%40mail.gmail.com

src/backend/access/heap/heapam_handler.c
src/backend/commands/analyze.c
src/include/access/tableam.h

index b83e2013d5080026fb7c77f7268619fdef5ae549..3ff36f59bf8695d197545c956bff99c2fea2d980 100644 (file)
@@ -1040,7 +1040,7 @@ heapam_scan_analyze_next_block(TableScanDesc scan, ReadStream *stream)
 }
 
 static bool
-heapam_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin,
+heapam_scan_analyze_next_tuple(TableScanDesc scan,
                                                           double *liverows, double *deadrows,
                                                           TupleTableSlot *slot)
 {
@@ -1061,6 +1061,7 @@ heapam_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin,
                ItemId          itemid;
                HeapTuple       targtuple = &hslot->base.tupdata;
                bool            sample_it = false;
+               TransactionId dead_after;
 
                itemid = PageGetItemId(targpage, hscan->rs_cindex);
 
@@ -1083,8 +1084,9 @@ heapam_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin,
                targtuple->t_data = (HeapTupleHeader) PageGetItem(targpage, itemid);
                targtuple->t_len = ItemIdGetLength(itemid);
 
-               switch (HeapTupleSatisfiesVacuum(targtuple, OldestXmin,
-                                                                                hscan->rs_cbuf))
+               switch (HeapTupleSatisfiesVacuumHorizon(targtuple,
+                                                                                               hscan->rs_cbuf,
+                                                                                               &dead_after))
                {
                        case HEAPTUPLE_LIVE:
                                sample_it = true;
index a483424152c5f0cf13b7801436c75619d04d3017..53adac9139bd45785b187d9fee11fa036b0e7dfc 100644 (file)
@@ -1213,7 +1213,6 @@ acquire_sample_rows(Relation onerel, int elevel,
        double          rowstoskip = -1;        /* -1 means not set yet */
        uint32          randseed;               /* Seed for block sampler(s) */
        BlockNumber totalblocks;
-       TransactionId OldestXmin;
        BlockSamplerData bs;
        ReservoirStateData rstate;
        TupleTableSlot *slot;
@@ -1226,9 +1225,6 @@ acquire_sample_rows(Relation onerel, int elevel,
 
        totalblocks = RelationGetNumberOfBlocks(onerel);
 
-       /* Need a cutoff xmin for HeapTupleSatisfiesVacuum */
-       OldestXmin = GetOldestNonRemovableTransactionId(onerel);
-
        /* Prepare for sampling block numbers */
        randseed = pg_prng_uint32(&pg_global_prng_state);
        nblocks = BlockSampler_Init(&bs, totalblocks, targrows, randseed);
@@ -1261,7 +1257,7 @@ acquire_sample_rows(Relation onerel, int elevel,
        {
                vacuum_delay_point(true);
 
-               while (table_scan_analyze_next_tuple(scan, OldestXmin, &liverows, &deadrows, slot))
+               while (table_scan_analyze_next_tuple(scan, &liverows, &deadrows, slot))
                {
                        /*
                         * The first targrows sample rows are simply copied into the
index 119593b7b4633cf2f572eaa3bf23a2bf0ff4ac96..06084752245d58f3b21bcfaacc0b168295222c01 100644 (file)
@@ -683,7 +683,6 @@ typedef struct TableAmRoutine
         * callback).
         */
        bool            (*scan_analyze_next_tuple) (TableScanDesc scan,
-                                                                                       TransactionId OldestXmin,
                                                                                        double *liverows,
                                                                                        double *deadrows,
                                                                                        TupleTableSlot *slot);
@@ -1726,11 +1725,11 @@ table_scan_analyze_next_block(TableScanDesc scan, ReadStream *stream)
  * tuples.
  */
 static inline bool
-table_scan_analyze_next_tuple(TableScanDesc scan, TransactionId OldestXmin,
+table_scan_analyze_next_tuple(TableScanDesc scan,
                                                          double *liverows, double *deadrows,
                                                          TupleTableSlot *slot)
 {
-       return scan->rs_rd->rd_tableam->scan_analyze_next_tuple(scan, OldestXmin,
+       return scan->rs_rd->rd_tableam->scan_analyze_next_tuple(scan,
                                                                                                                        liverows, deadrows,
                                                                                                                        slot);
 }