mirror of
https://github.com/postgres/postgres.git
synced 2025-06-14 18:42:34 +03:00
Make bitmap heap scans show exact/lossy block info in EXPLAIN ANALYZE.
Etsuro Fujita
This commit is contained in:
@ -85,6 +85,8 @@ static void show_sort_group_keys(PlanState *planstate, const char *qlabel,
|
|||||||
List *ancestors, ExplainState *es);
|
List *ancestors, ExplainState *es);
|
||||||
static void show_sort_info(SortState *sortstate, ExplainState *es);
|
static void show_sort_info(SortState *sortstate, ExplainState *es);
|
||||||
static void show_hash_info(HashState *hashstate, ExplainState *es);
|
static void show_hash_info(HashState *hashstate, ExplainState *es);
|
||||||
|
static void show_tidbitmap_info(BitmapHeapScanState *planstate,
|
||||||
|
ExplainState *es);
|
||||||
static void show_instrumentation_count(const char *qlabel, int which,
|
static void show_instrumentation_count(const char *qlabel, int which,
|
||||||
PlanState *planstate, ExplainState *es);
|
PlanState *planstate, ExplainState *es);
|
||||||
static void show_foreignscan_info(ForeignScanState *fsstate, ExplainState *es);
|
static void show_foreignscan_info(ForeignScanState *fsstate, ExplainState *es);
|
||||||
@ -1250,7 +1252,13 @@ ExplainNode(PlanState *planstate, List *ancestors,
|
|||||||
if (((BitmapHeapScan *) plan)->bitmapqualorig)
|
if (((BitmapHeapScan *) plan)->bitmapqualorig)
|
||||||
show_instrumentation_count("Rows Removed by Index Recheck", 2,
|
show_instrumentation_count("Rows Removed by Index Recheck", 2,
|
||||||
planstate, es);
|
planstate, es);
|
||||||
/* FALL THRU */
|
show_scan_qual(plan->qual, "Filter", planstate, ancestors, es);
|
||||||
|
if (plan->qual)
|
||||||
|
show_instrumentation_count("Rows Removed by Filter", 1,
|
||||||
|
planstate, es);
|
||||||
|
if (es->analyze)
|
||||||
|
show_tidbitmap_info((BitmapHeapScanState *) planstate, es);
|
||||||
|
break;
|
||||||
case T_SeqScan:
|
case T_SeqScan:
|
||||||
case T_ValuesScan:
|
case T_ValuesScan:
|
||||||
case T_CteScan:
|
case T_CteScan:
|
||||||
@ -1878,6 +1886,29 @@ show_hash_info(HashState *hashstate, ExplainState *es)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If it's EXPLAIN ANALYZE, show exact/lossy pages for a BitmapHeapScan node
|
||||||
|
*/
|
||||||
|
static void
|
||||||
|
show_tidbitmap_info(BitmapHeapScanState *planstate, ExplainState *es)
|
||||||
|
{
|
||||||
|
if (es->format != EXPLAIN_FORMAT_TEXT)
|
||||||
|
{
|
||||||
|
ExplainPropertyLong("Exact Heap Blocks", planstate->exact_pages, es);
|
||||||
|
ExplainPropertyLong("Lossy Heap Blocks", planstate->lossy_pages, es);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
appendStringInfoSpaces(es->str, es->indent * 2);
|
||||||
|
appendStringInfoString(es->str, "Heap Blocks:");
|
||||||
|
if (planstate->exact_pages > 0)
|
||||||
|
appendStringInfo(es->str, " exact=%ld", planstate->exact_pages);
|
||||||
|
if (planstate->lossy_pages > 0)
|
||||||
|
appendStringInfo(es->str, " lossy=%ld", planstate->lossy_pages);
|
||||||
|
appendStringInfoChar(es->str, '\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If it's EXPLAIN ANALYZE, show instrumentation information for a plan node
|
* If it's EXPLAIN ANALYZE, show instrumentation information for a plan node
|
||||||
*
|
*
|
||||||
|
@ -170,6 +170,11 @@ BitmapHeapNext(BitmapHeapScanState *node)
|
|||||||
*/
|
*/
|
||||||
bitgetpage(scan, tbmres);
|
bitgetpage(scan, tbmres);
|
||||||
|
|
||||||
|
if (tbmres->ntuples >= 0)
|
||||||
|
node->exact_pages++;
|
||||||
|
else
|
||||||
|
node->lossy_pages++;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Set rs_cindex to first slot to examine
|
* Set rs_cindex to first slot to examine
|
||||||
*/
|
*/
|
||||||
@ -553,6 +558,8 @@ ExecInitBitmapHeapScan(BitmapHeapScan *node, EState *estate, int eflags)
|
|||||||
scanstate->tbm = NULL;
|
scanstate->tbm = NULL;
|
||||||
scanstate->tbmiterator = NULL;
|
scanstate->tbmiterator = NULL;
|
||||||
scanstate->tbmres = NULL;
|
scanstate->tbmres = NULL;
|
||||||
|
scanstate->exact_pages = 0;
|
||||||
|
scanstate->lossy_pages = 0;
|
||||||
scanstate->prefetch_iterator = NULL;
|
scanstate->prefetch_iterator = NULL;
|
||||||
scanstate->prefetch_pages = 0;
|
scanstate->prefetch_pages = 0;
|
||||||
scanstate->prefetch_target = 0;
|
scanstate->prefetch_target = 0;
|
||||||
|
@ -1338,6 +1338,8 @@ typedef struct BitmapIndexScanState
|
|||||||
* tbm bitmap obtained from child index scan(s)
|
* tbm bitmap obtained from child index scan(s)
|
||||||
* tbmiterator iterator for scanning current pages
|
* tbmiterator iterator for scanning current pages
|
||||||
* tbmres current-page data
|
* tbmres current-page data
|
||||||
|
* exact_pages total number of exact pages retrieved
|
||||||
|
* lossy_pages total number of lossy pages retrieved
|
||||||
* prefetch_iterator iterator for prefetching ahead of current page
|
* prefetch_iterator iterator for prefetching ahead of current page
|
||||||
* prefetch_pages # pages prefetch iterator is ahead of current
|
* prefetch_pages # pages prefetch iterator is ahead of current
|
||||||
* prefetch_target target prefetch distance
|
* prefetch_target target prefetch distance
|
||||||
@ -1350,6 +1352,8 @@ typedef struct BitmapHeapScanState
|
|||||||
TIDBitmap *tbm;
|
TIDBitmap *tbm;
|
||||||
TBMIterator *tbmiterator;
|
TBMIterator *tbmiterator;
|
||||||
TBMIterateResult *tbmres;
|
TBMIterateResult *tbmres;
|
||||||
|
long exact_pages;
|
||||||
|
long lossy_pages;
|
||||||
TBMIterator *prefetch_iterator;
|
TBMIterator *prefetch_iterator;
|
||||||
int prefetch_pages;
|
int prefetch_pages;
|
||||||
int prefetch_target;
|
int prefetch_target;
|
||||||
|
Reference in New Issue
Block a user