Fix EXPLAIN Bitmap heap scan to count pages with no visible tuples
authorHeikki Linnakangas <[email protected]>
Mon, 18 Mar 2024 12:03:58 +0000 (14:03 +0200)
committerHeikki Linnakangas <[email protected]>
Mon, 18 Mar 2024 12:03:58 +0000 (14:03 +0200)
Previously, bitmap heap scans only counted lossy and exact pages for
explain when there was at least one visible tuple on the page.

heapam_scan_bitmap_next_block() returned true only if there was a
"valid" page with tuples to be processed. However, the lossy and exact
page counters in EXPLAIN should count the number of pages represented
in a lossy or non-lossy way in the constructed bitmap, regardless of
whether or not the pages ultimately contained visible tuples.

Backpatch to all supported versions.

Author: Melanie Plageman
Discussion: https://www.postgresql.org/message-id/CAAKRu_ZwCwWFeL_H3ia26bP2e7HiKLWt0ZmGXPVwPO6uXq0vaA@mail.gmail.com
Discussion: https://www.postgresql.org/message-id/CAAKRu_bxrXeZ2rCnY8LyeC2Ls88KpjWrQ%[email protected]

src/backend/executor/nodeBitmapHeapscan.c
src/test/regress/expected/partition_prune.out

index ca548e44eb4594bbe44f90255b258c93b82e722c..cee7f45aabec12040abf0a71eeae46cd3e5991c7 100644 (file)
@@ -204,6 +204,11 @@ BitmapHeapNext(BitmapHeapScanState *node)
 
            BitmapAdjustPrefetchIterator(node, tbmres);
 
+           if (tbmres->ntuples >= 0)
+               node->exact_pages++;
+           else
+               node->lossy_pages++;
+
            /*
             * We can skip fetching the heap page if we don't need any fields
             * from the heap, and the bitmap entries don't need rechecking,
@@ -235,11 +240,6 @@ BitmapHeapNext(BitmapHeapScanState *node)
                continue;
            }
 
-           if (tbmres->ntuples >= 0)
-               node->exact_pages++;
-           else
-               node->lossy_pages++;
-
            /* Adjust the prefetch target */
            BitmapAdjustPrefetchTarget(node);
        }
index bf0657b9f2c71b3ccde1a1128d2dfb604b8a25e9..9c20a24982f2d890ae6b1b2482ae77f0942347d7 100644 (file)
@@ -2848,6 +2848,7 @@ update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a;
                            Index Cond: (a = 1)
                ->  Bitmap Heap Scan on ab_a1_b3 ab_a1_3 (actual rows=0 loops=1)
                      Recheck Cond: (a = 1)
+                     Heap Blocks: exact=1
                      ->  Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1)
                            Index Cond: (a = 1)
          ->  Materialize (actual rows=1 loops=1)
@@ -2863,9 +2864,10 @@ update ab_a1 set b = 3 from ab where ab.a = 1 and ab.a = ab_a1.a;
                                  Index Cond: (a = 1)
                      ->  Bitmap Heap Scan on ab_a1_b3 ab_3 (actual rows=0 loops=1)
                            Recheck Cond: (a = 1)
+                           Heap Blocks: exact=1
                            ->  Bitmap Index Scan on ab_a1_b3_a_idx (actual rows=1 loops=1)
                                  Index Cond: (a = 1)
-(34 rows)
+(36 rows)
 
 table ab;
  a | b