From 500c84019b982a1e6c8b8dd40240c8510d83c287 Mon Sep 17 00:00:00 2001 From: Melanie Plageman Date: Tue, 13 Feb 2024 10:05:04 -0500 Subject: [PATCH v1 07/11] BitmapHeapScan scan desc counts lossy and exact pages Future commits will remove the TBMIterateResult from BitmapHeapNext(), pushing it into the table AM-specific code. So we will have to keep track of the number of lossy and exact pages in the scan descriptor. Doing this change to lossy/exact page counting in a separate commit just simplifies the diff. --- src/backend/access/heap/heapam.c | 2 ++ src/backend/access/heap/heapam_handler.c | 9 +++++++++ src/backend/executor/nodeBitmapHeapscan.c | 18 +++++++++++++----- src/include/access/relscan.h | 4 ++++ 4 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/backend/access/heap/heapam.c b/src/backend/access/heap/heapam.c index 7aae1ecf0a9..88b4aad5820 100644 --- a/src/backend/access/heap/heapam.c +++ b/src/backend/access/heap/heapam.c @@ -957,6 +957,8 @@ heap_beginscan(Relation relation, Snapshot snapshot, scan->rs_strategy = NULL; /* set in initscan */ scan->vmbuffer = InvalidBuffer; scan->empty_tuples = 0; + scan->rs_base.lossy_pages = 0; + scan->rs_base.exact_pages = 0; /* * Disable page-at-a-time mode if it's not a MVCC-safe snapshot. diff --git a/src/backend/access/heap/heapam_handler.c b/src/backend/access/heap/heapam_handler.c index baba09c87c0..6e85ef7a946 100644 --- a/src/backend/access/heap/heapam_handler.c +++ b/src/backend/access/heap/heapam_handler.c @@ -2242,6 +2242,15 @@ heapam_scan_bitmap_next_block(TableScanDesc scan, Assert(ntup <= MaxHeapTuplesPerPage); hscan->rs_ntuples = ntup; + /* Only count exact and lossy pages with visible tuples */ + if (ntup > 0) + { + if (tbmres->ntuples >= 0) + scan->exact_pages++; + else + scan->lossy_pages++; + } + return ntup > 0; } diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index c0fb06c9688..19d115de06f 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -53,6 +53,8 @@ #include "utils/spccache.h" static TupleTableSlot *BitmapHeapNext(BitmapHeapScanState *node); +static inline void BitmapAccumCounters(BitmapHeapScanState *node, + TableScanDesc scan); static inline void BitmapDoneInitializingSharedState(ParallelBitmapHeapState *pstate); static inline void BitmapAdjustPrefetchIterator(BitmapHeapScanState *node, BlockNumber blockno); @@ -234,11 +236,6 @@ BitmapHeapNext(BitmapHeapScanState *node) continue; } - if (tbmres->ntuples >= 0) - node->exact_pages++; - else - node->lossy_pages++; - /* Adjust the prefetch target */ BitmapAdjustPrefetchTarget(node); } @@ -315,9 +312,20 @@ BitmapHeapNext(BitmapHeapScanState *node) /* * if we get here it means we are at the end of the scan.. */ + BitmapAccumCounters(node, scan); return ExecClearTuple(slot); } +static inline void +BitmapAccumCounters(BitmapHeapScanState *node, + TableScanDesc scan) +{ + node->exact_pages += scan->exact_pages; + scan->exact_pages = 0; + node->lossy_pages += scan->lossy_pages; + scan->lossy_pages = 0; +} + /* * BitmapDoneInitializingSharedState - Shared state is initialized * diff --git a/src/include/access/relscan.h b/src/include/access/relscan.h index 521043304ab..b74e08dd745 100644 --- a/src/include/access/relscan.h +++ b/src/include/access/relscan.h @@ -40,6 +40,10 @@ typedef struct TableScanDescData ItemPointerData rs_mintid; ItemPointerData rs_maxtid; + /* Only used for Bitmap table scans */ + long exact_pages; + long lossy_pages; + /* * Information about type and behaviour of the scan, a bitmask of members * of the ScanOptions enum (see tableam.h). -- 2.37.2