vacuum_print_offset_stats.patch
application/octet-stream
Filename: vacuum_print_offset_stats.patch
Type: application/octet-stream
Part: 0
Patch
Format: unified
| File | + | − |
|---|---|---|
| src/backend/commands/vacuumlazy.c | 36 | 0 |
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)]++;
}
/*