diff --git a/src/backend/commands/analyze.c b/src/backend/commands/analyze.c
index 8af12b5c6b..6ce1159082 100644
--- a/src/backend/commands/analyze.c
+++ b/src/backend/commands/analyze.c
@@ -1070,6 +1070,33 @@ acquire_sample_rows(Relation onerel, int elevel,
 		if (!table_scan_analyze_next_block(scan, targblock, vac_strategy))
 			continue;
 
+		/*
+		 * Now that we have a block, if prefetch is enabled then get a few more.
+		 */
+#ifdef USE_PREFETCH
+		if (effective_io_concurrency)
+		{
+			/*
+			 * Make a deep copy of the block sampler to use for prefetching
+			 */
+			BlockSamplerData	prefetch_bs = bs;
+
+			memcpy(prefetch_bs.randstate, bs.randstate, sizeof(SamplerRandomState));
+
+			for (int i = 0; i < effective_io_concurrency; i++)
+			{
+				BlockNumber prefetch_block;
+
+				if (!BlockSampler_HasMore(&prefetch_bs))
+					break;
+
+				prefetch_block = BlockSampler_Next(&prefetch_bs);
+				PrefetchBuffer(scan->rs_rd, MAIN_FORKNUM, prefetch_block);
+			}
+
+		}
+#endif
+
 		while (table_scan_analyze_next_tuple(scan, OldestXmin, &liverows, &deadrows, slot))
 		{
 			/*
