diff options
Diffstat (limited to 'src/backend/commands/explain.c')
| -rw-r--r-- | src/backend/commands/explain.c | 58 |
1 files changed, 48 insertions, 10 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c index 6defd26df50..118db12903c 100644 --- a/src/backend/commands/explain.c +++ b/src/backend/commands/explain.c @@ -2010,8 +2010,7 @@ ExplainNode(PlanState *planstate, List *ancestors, if (plan->qual) show_instrumentation_count("Rows Removed by Filter", 1, planstate, es); - if (es->analyze) - show_tidbitmap_info((BitmapHeapScanState *) planstate, es); + show_tidbitmap_info((BitmapHeapScanState *) planstate, es); break; case T_SampleScan: show_tablesample(((SampleScan *) plan)->tablesample, @@ -3628,31 +3627,70 @@ show_hashagg_info(AggState *aggstate, ExplainState *es) } /* - * If it's EXPLAIN ANALYZE, show exact/lossy pages for a BitmapHeapScan node + * Show exact/lossy pages for a BitmapHeapScan node */ static void show_tidbitmap_info(BitmapHeapScanState *planstate, ExplainState *es) { + if (!es->analyze) + return; + if (es->format != EXPLAIN_FORMAT_TEXT) { ExplainPropertyUInteger("Exact Heap Blocks", NULL, - planstate->exact_pages, es); + planstate->stats.exact_pages, es); ExplainPropertyUInteger("Lossy Heap Blocks", NULL, - planstate->lossy_pages, es); + planstate->stats.lossy_pages, es); } else { - if (planstate->exact_pages > 0 || planstate->lossy_pages > 0) + if (planstate->stats.exact_pages > 0 || planstate->stats.lossy_pages > 0) { ExplainIndentText(es); appendStringInfoString(es->str, "Heap Blocks:"); - if (planstate->exact_pages > 0) - appendStringInfo(es->str, " exact=" UINT64_FORMAT, planstate->exact_pages); - if (planstate->lossy_pages > 0) - appendStringInfo(es->str, " lossy=" UINT64_FORMAT, planstate->lossy_pages); + if (planstate->stats.exact_pages > 0) + appendStringInfo(es->str, " exact=" UINT64_FORMAT, planstate->stats.exact_pages); + if (planstate->stats.lossy_pages > 0) + appendStringInfo(es->str, " lossy=" UINT64_FORMAT, planstate->stats.lossy_pages); appendStringInfoChar(es->str, '\n'); } } + + /* Display stats for each parallel worker */ + if (planstate->pstate != NULL) + { + for (int n = 0; n < planstate->sinstrument->num_workers; n++) + { + BitmapHeapScanInstrumentation *si = &planstate->sinstrument->sinstrument[n]; + + if (si->exact_pages == 0 && si->lossy_pages == 0) + continue; + + if (es->workers_state) + ExplainOpenWorker(n, es); + + if (es->format == EXPLAIN_FORMAT_TEXT) + { + ExplainIndentText(es); + appendStringInfoString(es->str, "Heap Blocks:"); + if (si->exact_pages > 0) + appendStringInfo(es->str, " exact=" UINT64_FORMAT, si->exact_pages); + if (si->lossy_pages > 0) + appendStringInfo(es->str, " lossy=" UINT64_FORMAT, si->lossy_pages); + appendStringInfoChar(es->str, '\n'); + } + else + { + ExplainPropertyUInteger("Exact Heap Blocks", NULL, + si->exact_pages, es); + ExplainPropertyUInteger("Lossy Heap Blocks", NULL, + si->lossy_pages, es); + } + + if (es->workers_state) + ExplainCloseWorker(n, es); + } + } } /* |
