diff options
Diffstat (limited to 'src/backend/commands/vacuumlazy.c')
-rw-r--r-- | src/backend/commands/vacuumlazy.c | 147 |
1 files changed, 43 insertions, 104 deletions
diff --git a/src/backend/commands/vacuumlazy.c b/src/backend/commands/vacuumlazy.c index b270538bd86..00fda192310 100644 --- a/src/backend/commands/vacuumlazy.c +++ b/src/backend/commands/vacuumlazy.c @@ -31,7 +31,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.69 2006/03/31 23:32:06 tgl Exp $ + * $PostgreSQL: pgsql/src/backend/commands/vacuumlazy.c,v 1.70 2006/05/02 22:25:10 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -96,11 +96,12 @@ static TransactionId FreezeLimit; static void lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, Relation *Irel, int nindexes); static void lazy_vacuum_heap(Relation onerel, LVRelStats *vacrelstats); -static void lazy_scan_index(Relation indrel, LVRelStats *vacrelstats); static void lazy_vacuum_index(Relation indrel, - double *index_tups_vacuumed, - BlockNumber *index_pages_removed, - LVRelStats *vacrelstats); + IndexBulkDeleteResult **stats, + LVRelStats *vacrelstats); +static void lazy_cleanup_index(Relation indrel, + IndexBulkDeleteResult *stats, + LVRelStats *vacrelstats); static int lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer, int tupindex, LVRelStats *vacrelstats); static void lazy_truncate_heap(Relation onerel, LVRelStats *vacrelstats); @@ -112,7 +113,6 @@ static void lazy_record_dead_tuple(LVRelStats *vacrelstats, static void lazy_record_free_space(LVRelStats *vacrelstats, BlockNumber page, Size avail); static bool lazy_tid_reaped(ItemPointer itemptr, void *state); -static bool dummy_tid_reaped(ItemPointer itemptr, void *state); static void lazy_update_fsm(Relation onerel, LVRelStats *vacrelstats); static int vac_cmp_itemptr(const void *left, const void *right); static int vac_cmp_page_spaces(const void *left, const void *right); @@ -207,9 +207,7 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, tups_vacuumed, nkeep, nunused; - double *index_tups_vacuumed; - BlockNumber *index_pages_removed; - bool did_vacuum_index = false; + IndexBulkDeleteResult **indstats; int i; PGRUsage ru0; @@ -224,15 +222,8 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, empty_pages = 0; num_tuples = tups_vacuumed = nkeep = nunused = 0; - /* - * Because index vacuuming is done in multiple passes, we have to keep - * track of the total number of rows and pages removed from each index. - * index_tups_vacuumed[i] is the number removed so far from the i'th - * index. (For partial indexes this could well be different from - * tups_vacuumed.) Likewise for index_pages_removed[i]. - */ - index_tups_vacuumed = (double *) palloc0(nindexes * sizeof(double)); - index_pages_removed = (BlockNumber *) palloc0(nindexes * sizeof(BlockNumber)); + indstats = (IndexBulkDeleteResult **) + palloc0(nindexes * sizeof(IndexBulkDeleteResult *)); nblocks = RelationGetNumberOfBlocks(onerel); vacrelstats->rel_pages = nblocks; @@ -263,10 +254,8 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, /* Remove index entries */ for (i = 0; i < nindexes; i++) lazy_vacuum_index(Irel[i], - &index_tups_vacuumed[i], - &index_pages_removed[i], + &indstats[i], vacrelstats); - did_vacuum_index = true; /* Remove tuples from heap */ lazy_vacuum_heap(onerel, vacrelstats); /* Forget the now-vacuumed tuples, and press on */ @@ -454,18 +443,15 @@ lazy_scan_heap(Relation onerel, LVRelStats *vacrelstats, /* Remove index entries */ for (i = 0; i < nindexes; i++) lazy_vacuum_index(Irel[i], - &index_tups_vacuumed[i], - &index_pages_removed[i], + &indstats[i], vacrelstats); /* Remove tuples from heap */ lazy_vacuum_heap(onerel, vacrelstats); } - else if (!did_vacuum_index) - { - /* Must do post-vacuum cleanup and statistics update anyway */ - for (i = 0; i < nindexes; i++) - lazy_scan_index(Irel[i], vacrelstats); - } + + /* Do post-vacuum cleanup and statistics update for each index */ + for (i = 0; i < nindexes; i++) + lazy_cleanup_index(Irel[i], indstats[i], vacrelstats); ereport(elevel, (errmsg("\"%s\": found %.0f removable, %.0f nonremovable row versions in %u pages", @@ -591,15 +577,17 @@ lazy_vacuum_page(Relation onerel, BlockNumber blkno, Buffer buffer, } /* - * lazy_scan_index() -- scan one index relation to update pg_class statistic. + * lazy_vacuum_index() -- vacuum one index relation. * - * We use this when we have no deletions to do. + * Delete all the index entries pointing to tuples listed in + * vacrelstats->dead_tuples, and update running statistics. */ static void -lazy_scan_index(Relation indrel, LVRelStats *vacrelstats) +lazy_vacuum_index(Relation indrel, + IndexBulkDeleteResult **stats, + LVRelStats *vacrelstats) { - IndexBulkDeleteResult *stats; - IndexVacuumCleanupInfo vcinfo; + IndexVacuumInfo ivinfo; PGRUsage ru0; pg_rusage_init(&ru0); @@ -613,20 +601,15 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats) else LockRelation(indrel, AccessExclusiveLock); - /* - * Even though we're not planning to delete anything, we use the - * ambulkdelete call, because (a) the scan happens within the index AM for - * more speed, and (b) it may want to pass private statistics to the - * amvacuumcleanup call. - */ - stats = index_bulk_delete(indrel, dummy_tid_reaped, NULL); - - /* Do post-VACUUM cleanup, even though we deleted nothing */ - vcinfo.vacuum_full = false; - vcinfo.message_level = elevel; - vcinfo.num_heap_tuples = vacrelstats->rel_tuples; + ivinfo.index = indrel; + ivinfo.vacuum_full = false; + ivinfo.message_level = elevel; + /* We don't yet know rel_tuples, so pass -1 */ + ivinfo.num_heap_tuples = -1; - stats = index_vacuum_cleanup(indrel, &vcinfo, stats); + /* Do bulk deletion */ + *stats = index_bulk_delete(&ivinfo, *stats, + lazy_tid_reaped, (void *) vacrelstats); /* * Release lock acquired above. @@ -636,48 +619,22 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats) else UnlockRelation(indrel, AccessExclusiveLock); - if (!stats) - return; - - /* now update statistics in pg_class */ - vac_update_relstats(RelationGetRelid(indrel), - stats->num_pages, - stats->num_index_tuples, - false); - ereport(elevel, - (errmsg("index \"%s\" now contains %.0f row versions in %u pages", + (errmsg("scanned index \"%s\" to remove %d row versions", RelationGetRelationName(indrel), - stats->num_index_tuples, - stats->num_pages), - errdetail("%u index pages have been deleted, %u are currently reusable.\n" - "%s.", - stats->pages_deleted, stats->pages_free, - pg_rusage_show(&ru0)))); - - pfree(stats); + vacrelstats->num_dead_tuples), + errdetail("%s.", pg_rusage_show(&ru0)))); } /* - * lazy_vacuum_index() -- vacuum one index relation. - * - * Delete all the index entries pointing to tuples listed in - * vacrelstats->dead_tuples. - * - * Increment *index_tups_vacuumed by the number of index entries - * removed, and *index_pages_removed by the number of pages removed. - * - * Finally, we arrange to update the index relation's statistics in - * pg_class. + * lazy_cleanup_index() -- do post-vacuum cleanup for one index relation. */ static void -lazy_vacuum_index(Relation indrel, - double *index_tups_vacuumed, - BlockNumber *index_pages_removed, - LVRelStats *vacrelstats) +lazy_cleanup_index(Relation indrel, + IndexBulkDeleteResult *stats, + LVRelStats *vacrelstats) { - IndexBulkDeleteResult *stats; - IndexVacuumCleanupInfo vcinfo; + IndexVacuumInfo ivinfo; PGRUsage ru0; pg_rusage_init(&ru0); @@ -691,17 +648,12 @@ lazy_vacuum_index(Relation indrel, else LockRelation(indrel, AccessExclusiveLock); - /* Do bulk deletion */ - stats = index_bulk_delete(indrel, lazy_tid_reaped, (void *) vacrelstats); - - /* Do post-VACUUM cleanup */ - vcinfo.vacuum_full = false; - vcinfo.message_level = elevel; - /* We don't yet know rel_tuples, so pass -1 */ - /* index_bulk_delete can't have skipped scan anyway ... */ - vcinfo.num_heap_tuples = -1; + ivinfo.index = indrel; + ivinfo.vacuum_full = false; + ivinfo.message_level = elevel; + ivinfo.num_heap_tuples = vacrelstats->rel_tuples; - stats = index_vacuum_cleanup(indrel, &vcinfo, stats); + stats = index_vacuum_cleanup(&ivinfo, stats); /* * Release lock acquired above. @@ -714,10 +666,6 @@ lazy_vacuum_index(Relation indrel, if (!stats) return; - /* accumulate total removed over multiple index-cleaning cycles */ - *index_tups_vacuumed += stats->tuples_removed; - *index_pages_removed += stats->pages_removed; - /* now update statistics in pg_class */ vac_update_relstats(RelationGetRelid(indrel), stats->num_pages, @@ -1135,15 +1083,6 @@ lazy_tid_reaped(ItemPointer itemptr, void *state) } /* - * Dummy version for lazy_scan_index. - */ -static bool -dummy_tid_reaped(ItemPointer itemptr, void *state) -{ - return false; -} - -/* * Update the shared Free Space Map with the info we now have about * free space in the relation, discarding any old info the map may have. */ |