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;
 
 /* ----------------
