aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRobert Haas <rhaas@postgresql.org>2012-01-25 20:40:34 -0500
committerRobert Haas <rhaas@postgresql.org>2012-01-25 20:41:52 -0500
commit9f9135d129e915e72c8a2f770689fd72619ead49 (patch)
tree644c9d0a29e9ccc7b2fd21a00931d62d7bd5094c /src
parent08146775acd8bfe0fcc509c71857abb928697171 (diff)
downloadpostgresql-9f9135d129e915e72c8a2f770689fd72619ead49.tar.gz
postgresql-9f9135d129e915e72c8a2f770689fd72619ead49.zip
Instrument index-only scans to count heap fetches performed.
Patch by me; review by Tom Lane, Jeff Davis, and Peter Geoghegan.
Diffstat (limited to 'src')
-rw-r--r--src/backend/commands/explain.c3
-rw-r--r--src/backend/executor/nodeIndexonlyscan.c2
-rw-r--r--src/include/nodes/execnodes.h2
3 files changed, 7 insertions, 0 deletions
diff --git a/src/backend/commands/explain.c b/src/backend/commands/explain.c
index 8b48105974f..e297e9cfb90 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 7f1100e15e4..4abd805aa31 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 */
@@ -346,6 +347,7 @@ ExecInitIndexOnlyScan(IndexOnlyScan *node, EState *estate, int eflags)
indexstate = makeNode(IndexOnlyScanState);
indexstate->ss.ps.plan = (Plan *) node;
indexstate->ss.ps.state = estate;
+ indexstate->ioss_HeapFetches = 0;
/*
* Miscellaneous initialization
diff --git a/src/include/nodes/execnodes.h b/src/include/nodes/execnodes.h
index da4b695cd64..5207102f6c9 100644
--- a/src/include/nodes/execnodes.h
+++ b/src/include/nodes/execnodes.h
@@ -1260,6 +1260,7 @@ typedef struct IndexScanState
* RelationDesc index relation descriptor
* ScanDesc index scan descriptor
* VMBuffer buffer in use for visibility map testing, if any
+ * HeapFetches number of tuples we were forced to fetch from heap
* ----------------
*/
typedef struct IndexOnlyScanState
@@ -1277,6 +1278,7 @@ typedef struct IndexOnlyScanState
Relation ioss_RelationDesc;
IndexScanDesc ioss_ScanDesc;
Buffer ioss_VMBuffer;
+ long ioss_HeapFetches;
} IndexOnlyScanState;
/* ----------------