diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c
index 2429889..da25016 100644
--- a/src/backend/commands/vacuumlazy.c
+++ b/src/backend/commands/vacuumlazy.c
@@ -121,6 +121,8 @@ typedef struct LVRelStats
 	int			num_index_scans;
 	TransactionId latestRemovedXid;
 	bool		lock_waiter_detected;
+	double		count_tuples_at_offset[MaxOffsetNumber];
+	double		count_dead_tuples_at_offset[MaxOffsetNumber];
 } LVRelStats;
 
 
@@ -236,6 +238,11 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params,
 	vacrelstats->pages_removed = 0;
 	vacrelstats->lock_waiter_detected = false;
 
+	memset(vacrelstats->count_tuples_at_offset, 0, sizeof (double) *
+			MaxOffsetNumber);
+	memset(vacrelstats->count_dead_tuples_at_offset, 0, sizeof (double) *
+			MaxOffsetNumber);
+
 	/* Open all indexes of the relation */
 	vac_open_indexes(onerel, RowExclusiveLock, &nindexes, &Irel);
 	vacrelstats->hasindex = (nindexes > 0);
@@ -337,6 +344,7 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params,
 									   params->log_min_duration))
 		{
 			StringInfoData buf;
+			OffsetNumber offnum;
 
 			TimestampDifference(starttime, endtime, &secs, &usecs);
 
@@ -378,6 +386,16 @@ lazy_vacuum_rel(Relation onerel, int options, VacuumParams *params,
 							 read_rate, write_rate);
 			appendStringInfo(&buf, _("system usage: %s"), pg_rusage_show(&ru0));
 
+			appendStringInfo(&buf, _("tuple count at each offset (offnum:all_tuples:dead_tuples)\n"));
+			for (offnum = 0; offnum < MaxOffsetNumber; offnum++)
+			{
+				if (vacrelstats->count_tuples_at_offset[offnum] > 0 ||
+					vacrelstats->count_dead_tuples_at_offset[offnum] > 0)
+					appendStringInfo(&buf, _("%d:%.0f:%.0f\n"), offnum,
+							vacrelstats->count_tuples_at_offset[offnum],
+							vacrelstats->count_dead_tuples_at_offset[offnum]);
+			}
+
 			ereport(LOG,
 					(errmsg_internal("%s", buf.data)));
 			pfree(buf.data);
@@ -787,6 +805,8 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
 				continue;
 			}
 
+			vacrelstats->count_tuples_at_offset[offnum]++;
+
 			/* Redirect items mustn't be touched */
 			if (ItemIdIsRedirected(itemid))
 			{
@@ -1135,6 +1155,20 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats,
 	appendStringInfo(&buf, _("%s."),
 					 pg_rusage_show(&ru0));
 
+	{
+		OffsetNumber offnum;
+
+		appendStringInfo(&buf, _("tuple count at each offset (offnum:all_tuples:dead_tuples)\n"));
+		for (offnum = 0; offnum < MaxOffsetNumber; offnum++)
+		{
+			if (vacrelstats->count_tuples_at_offset[offnum] > 0 ||
+				vacrelstats->count_dead_tuples_at_offset[offnum] > 0)
+				appendStringInfo(&buf, _("%d:%.0f:%.0f\n"), offnum,
+						vacrelstats->count_tuples_at_offset[offnum],
+						vacrelstats->count_dead_tuples_at_offset[offnum]);
+		}
+	}
+
 	ereport(elevel,
 			(errmsg("\"%s\": found %.0f removable, %.0f nonremovable row versions in %u out of %u pages",
 					RelationGetRelationName(onerel),
@@ -1726,6 +1760,8 @@ lazy_record_dead_tuple(LVRelStats *vacrelstats,
 		vacrelstats->dead_tuples[vacrelstats->num_dead_tuples] = *itemptr;
 		vacrelstats->num_dead_tuples++;
 	}
+
+	vacrelstats->count_dead_tuples_at_offset[ItemPointerGetOffsetNumber(itemptr)]++;
 }
 
 /*
