@@ -125,8 +125,6 @@ typedef struct LVRelStats
125
125
double new_rel_tuples ; /* new estimated total # of tuples */
126
126
double new_live_tuples ; /* new estimated total # of live tuples */
127
127
double new_dead_tuples ; /* new estimated total # of dead tuples */
128
- double nleft_dead_tuples ; /* # of dead tuples we left */
129
- double nleft_dead_itemids ; /* # of dead item pointers we left */
130
128
BlockNumber pages_removed ;
131
129
double tuples_deleted ;
132
130
BlockNumber nonempty_pages ; /* actually, last nonempty page + 1 */
@@ -427,12 +425,6 @@ heap_vacuum_rel(Relation onerel, VacuumParams *params,
427
425
vacrelstats -> new_rel_tuples ,
428
426
vacrelstats -> new_dead_tuples ,
429
427
OldestXmin );
430
- if (vacrelstats -> nleft_dead_tuples > 0 ||
431
- vacrelstats -> nleft_dead_itemids > 0 )
432
- appendStringInfo (& buf ,
433
- _ ("%.0f tuples and %.0f item identifiers are left as dead.\n" ),
434
- vacrelstats -> nleft_dead_tuples ,
435
- vacrelstats -> nleft_dead_itemids );
436
428
appendStringInfo (& buf ,
437
429
_ ("buffer usage: %d hits, %d misses, %d dirtied\n" ),
438
430
VacuumPageHit ,
@@ -515,10 +507,7 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
515
507
live_tuples , /* live tuples (reltuples estimate) */
516
508
tups_vacuumed , /* tuples cleaned up by vacuum */
517
509
nkeep , /* dead-but-not-removable tuples */
518
- nunused , /* unused item pointers */
519
- nleft_dead_tuples , /* tuples we left as dead */
520
- nleft_dead_itemids ; /* item pointers we left as dead,
521
- * includes nleft_dead_tuples. */
510
+ nunused ; /* unused item pointers */
522
511
IndexBulkDeleteResult * * indstats ;
523
512
int i ;
524
513
PGRUsage ru0 ;
@@ -551,7 +540,6 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
551
540
empty_pages = vacuumed_pages = 0 ;
552
541
next_fsm_block_to_vacuum = (BlockNumber ) 0 ;
553
542
num_tuples = live_tuples = tups_vacuumed = nkeep = nunused = 0 ;
554
- nleft_dead_itemids = nleft_dead_tuples = 0 ;
555
543
556
544
indstats = (IndexBulkDeleteResult * * )
557
545
palloc0 (nindexes * sizeof (IndexBulkDeleteResult * ));
@@ -1075,7 +1063,11 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
1075
1063
* it were RECENTLY_DEAD. Also, if it's a heap-only
1076
1064
* tuple, we choose to keep it, because it'll be a lot
1077
1065
* cheaper to get rid of it in the next pruning pass than
1078
- * to treat it like an indexed tuple.
1066
+ * to treat it like an indexed tuple. Finally, if index
1067
+ * cleanup is disabled, the second heap pass will not
1068
+ * execute, and the tuple will not get removed, so we
1069
+ * must treat it like any other dead tuple that we choose
1070
+ * to keep.
1079
1071
*
1080
1072
* If this were to happen for a tuple that actually needed
1081
1073
* to be deleted, we'd be in trouble, because it'd
@@ -1085,20 +1077,11 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
1085
1077
* preventing corruption.
1086
1078
*/
1087
1079
if (HeapTupleIsHotUpdated (& tuple ) ||
1088
- HeapTupleIsHeapOnly (& tuple ))
1080
+ HeapTupleIsHeapOnly (& tuple ) ||
1081
+ params -> index_cleanup == VACOPT_TERNARY_DISABLED )
1089
1082
nkeep += 1 ;
1090
1083
else
1091
- {
1092
1084
tupgone = true; /* we can delete the tuple */
1093
-
1094
- /*
1095
- * Since this dead tuple will not be vacuumed and
1096
- * ignored when index cleanup is disabled we count
1097
- * count it for reporting.
1098
- */
1099
- if (params -> index_cleanup == VACOPT_TERNARY_ENABLED )
1100
- nleft_dead_tuples ++ ;
1101
- }
1102
1085
all_visible = false;
1103
1086
break ;
1104
1087
case HEAPTUPLE_LIVE :
@@ -1275,7 +1258,6 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
1275
1258
* the next vacuum will process them anyway.
1276
1259
*/
1277
1260
Assert (params -> index_cleanup == VACOPT_TERNARY_DISABLED );
1278
- nleft_dead_itemids += vacrelstats -> num_dead_tuples ;
1279
1261
}
1280
1262
1281
1263
/*
@@ -1402,21 +1384,14 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
1402
1384
RecordPageWithFreeSpace (onerel , blkno , freespace , nblocks );
1403
1385
}
1404
1386
1405
- /* No dead tuples should be left if index cleanup is enabled */
1406
- Assert ((params -> index_cleanup == VACOPT_TERNARY_ENABLED &&
1407
- nleft_dead_tuples == 0 && nleft_dead_itemids == 0 ) ||
1408
- params -> index_cleanup == VACOPT_TERNARY_DISABLED );
1409
-
1410
1387
/* report that everything is scanned and vacuumed */
1411
1388
pgstat_progress_update_param (PROGRESS_VACUUM_HEAP_BLKS_SCANNED , blkno );
1412
1389
1413
1390
pfree (frozen );
1414
1391
1415
1392
/* save stats for use later */
1416
1393
vacrelstats -> tuples_deleted = tups_vacuumed ;
1417
- vacrelstats -> new_dead_tuples = nkeep + nleft_dead_tuples ;
1418
- vacrelstats -> nleft_dead_tuples = nleft_dead_tuples ;
1419
- vacrelstats -> nleft_dead_itemids = nleft_dead_itemids ;
1394
+ vacrelstats -> new_dead_tuples = nkeep ;
1420
1395
1421
1396
/* now we can compute the new value for pg_class.reltuples */
1422
1397
vacrelstats -> new_live_tuples = vac_estimate_reltuples (onerel ,
@@ -1520,8 +1495,6 @@ lazy_scan_heap(Relation onerel, VacuumParams *params, LVRelStats *vacrelstats,
1520
1495
"%u pages are entirely empty.\n" ,
1521
1496
empty_pages ),
1522
1497
empty_pages );
1523
- appendStringInfo (& buf , "%.0f tuples and %.0f item identifiers are left as dead.\n" ,
1524
- nleft_dead_tuples , nleft_dead_itemids );
1525
1498
appendStringInfo (& buf , _ ("%s." ), pg_rusage_show (& ru0 ));
1526
1499
1527
1500
ereport (elevel ,
0 commit comments