explain-heap-fetches.patch
application/octet-stream
Filename: explain-heap-fetches.patch
Type: application/octet-stream
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/explain.c | 3 | 0 |
| src/backend/executor/nodeIndexonlyscan.c | 1 | 0 |
| src/include/nodes/execnodes.h | 1 | 0 |
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 8b48105..e297e9c 100644
--- a/src/backend/commands/explain.c
+++ b/src/backend/commands/explain.c
@@ -1012,6 +1012,9 @@ ExplainNode(PlanState *planstate, List *ancestors,
if (plan->qual)
show_instrumentation_count("Rows Removed by Filter", 1,
planstate, es);
+ if (es->analyze)
+ ExplainPropertyLong("Heap Fetches",
+ ((IndexOnlyScanState *) planstate)->ioss_HeapFetches, es);
break;
case T_BitmapIndexScan:
show_scan_qual(((BitmapIndexScan *) plan)->indexqualorig,
diff --git a/src/backend/executor/nodeIndexonlyscan.c b/src/backend/executor/nodeIndexonlyscan.c
index 7f1100e..27e1e84 100644
--- a/src/backend/executor/nodeIndexonlyscan.c
+++ b/src/backend/executor/nodeIndexonlyscan.c
@@ -90,6 +90,7 @@ IndexOnlyNext(IndexOnlyScanState *node)
/*
* Rats, we have to visit the heap to check visibility.
*/
+ ++node->ioss_HeapFetches;
tuple = index_fetch_heap(scandesc);
if (tuple == NULL)
continue; /* no visible tuple, try next index entry */
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index da4b695..bd9024b 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1277,6 +1277,7 @@ typedef struct IndexOnlyScanState
Relation ioss_RelationDesc;
IndexScanDesc ioss_ScanDesc;
Buffer ioss_VMBuffer;
+ long ioss_HeapFetches;
} IndexOnlyScanState;
/* ----------------