diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index a6c6de7..94eaf82 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -2723,6 +2723,8 @@ show_tidbitmap_info(BitmapHeapScanState *planstate, ExplainState *es) { if (es->format != EXPLAIN_FORMAT_TEXT) { + ExplainPropertyInteger("Avoided Heap Blocks", NULL, + planstate->unfetched_pages, es); ExplainPropertyInteger("Exact Heap Blocks", NULL, planstate->exact_pages, es); ExplainPropertyInteger("Lossy Heap Blocks", NULL, @@ -2730,10 +2732,12 @@ show_tidbitmap_info(BitmapHeapScanState *planstate, ExplainState *es) } else { - if (planstate->exact_pages > 0 || planstate->lossy_pages > 0) + if (planstate->unfetched_pages > 0 || planstate->exact_pages > 0 || planstate->lossy_pages > 0) { appendStringInfoSpaces(es->str, es->indent * 2); appendStringInfoString(es->str, "Heap Blocks:"); + if (planstate->unfetched_pages > 0) + appendStringInfo(es->str, " avoided=%ld", planstate->unfetched_pages); if (planstate->exact_pages > 0) appendStringInfo(es->str, " exact=%ld", planstate->exact_pages); if (planstate->lossy_pages > 0) diff --git a/src/backend/executor/nodeBitmapHeapscan.c b/src/backend/executor/nodeBitmapHeapscan.c index a74b46c..d516653 100644 --- a/src/backend/executor/nodeBitmapHeapscan.c +++ b/src/backend/executor/nodeBitmapHeapscan.c @@ -234,17 +234,20 @@ BitmapHeapNext(BitmapHeapScanState *node) * node->return_empty_tuples. */ node->return_empty_tuples = tbmres->ntuples; + node->unfetched_pages++; } else if (!table_scan_bitmap_next_block(scan, tbmres)) { /* AM doesn't think this block is valid, skip */ continue; } - - if (tbmres->ntuples >= 0) - node->exact_pages++; else - node->lossy_pages++; + { + if (tbmres->ntuples >= 0) + node->exact_pages++; + else + node->lossy_pages++; + } /* Adjust the prefetch target */ BitmapAdjustPrefetchTarget(node); diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h index 4b1635e..b7cb733 100644 --- a/src/include/nodes/execnodes.h +++ b/src/include/nodes/execnodes.h @@ -1515,6 +1515,7 @@ typedef struct ParallelBitmapHeapState * pvmbuffer ditto, for prefetched pages * exact_pages total number of exact pages retrieved * lossy_pages total number of lossy pages retrieved + * unfetched_pages total number of pages not retrieved due to vm * prefetch_iterator iterator for prefetching ahead of current page * prefetch_pages # pages prefetch iterator is ahead of current * prefetch_target current target prefetch distance @@ -1539,6 +1540,7 @@ typedef struct BitmapHeapScanState Buffer pvmbuffer; long exact_pages; long lossy_pages; + long unfetched_pages; TBMIterator *prefetch_iterator; int prefetch_pages; int prefetch_target;