diff options
author | Robert Haas <rhaas@postgresql.org> | 2012-01-25 20:40:34 -0500 |
---|---|---|
committer | Robert Haas <rhaas@postgresql.org> | 2012-01-25 20:41:52 -0500 |
commit | 9f9135d129e915e72c8a2f770689fd72619ead49 (patch) | |
tree | 644c9d0a29e9ccc7b2fd21a00931d62d7bd5094c /src | |
parent | 08146775acd8bfe0fcc509c71857abb928697171 (diff) | |
download | postgresql-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.c | 3 | ||||
-rw-r--r-- | src/backend/executor/nodeIndexonlyscan.c | 2 | ||||
-rw-r--r-- | src/include/nodes/execnodes.h | 2 |
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; /* ---------------- |