Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 0797bb5

Browse files
committed
During VACUUM FULL, truncate off any deletable pages that are at the
end of a btree index. This isn't super-effective, since we won't move nondeletable pages, but it's better than nothing. Also, improve stats displayed during VACUUM VERBOSE.
1 parent 3981f21 commit 0797bb5

File tree

7 files changed

+79
-30
lines changed

7 files changed

+79
-30
lines changed

src/backend/access/gist/gist.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.100 2003/02/22 00:45:03 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/gist/gist.c,v 1.101 2003/02/24 00:57:17 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1648,11 +1648,10 @@ gistbulkdelete(PG_FUNCTION_ARGS)
16481648
/* return statistics */
16491649
num_pages = RelationGetNumberOfBlocks(rel);
16501650

1651-
result = (IndexBulkDeleteResult *) palloc(sizeof(IndexBulkDeleteResult));
1651+
result = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult));
16521652
result->num_pages = num_pages;
16531653
result->num_index_tuples = num_index_tuples;
16541654
result->tuples_removed = tuples_removed;
1655-
result->pages_free = 0;
16561655

16571656
PG_RETURN_POINTER(result);
16581657
}

src/backend/access/hash/hash.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.61 2003/02/22 00:45:03 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/hash/hash.c,v 1.62 2003/02/24 00:57:17 tgl Exp $
1212
*
1313
* NOTES
1414
* This file contains only the public interface routines.
@@ -489,11 +489,10 @@ hashbulkdelete(PG_FUNCTION_ARGS)
489489
/* return statistics */
490490
num_pages = RelationGetNumberOfBlocks(rel);
491491

492-
result = (IndexBulkDeleteResult *) palloc(sizeof(IndexBulkDeleteResult));
492+
result = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult));
493493
result->num_pages = num_pages;
494494
result->num_index_tuples = num_index_tuples;
495495
result->tuples_removed = tuples_removed;
496-
result->pages_free = 0;
497496

498497
PG_RETURN_POINTER(result);
499498
}

src/backend/access/nbtree/nbtree.c

Lines changed: 58 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* Portions Copyright (c) 1994, Regents of the University of California
1313
*
1414
* IDENTIFICATION
15-
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.99 2003/02/23 23:27:21 tgl Exp $
15+
* $Header: /cvsroot/pgsql/src/backend/access/nbtree/nbtree.c,v 1.100 2003/02/24 00:57:17 tgl Exp $
1616
*
1717
*-------------------------------------------------------------------------
1818
*/
@@ -24,6 +24,7 @@
2424
#include "catalog/index.h"
2525
#include "miscadmin.h"
2626
#include "storage/freespace.h"
27+
#include "storage/smgr.h"
2728

2829

2930
/* Working state for btbuild and its callback */
@@ -673,11 +674,10 @@ btbulkdelete(PG_FUNCTION_ARGS)
673674
/* return statistics */
674675
num_pages = RelationGetNumberOfBlocks(rel);
675676

676-
result = (IndexBulkDeleteResult *) palloc(sizeof(IndexBulkDeleteResult));
677+
result = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult));
677678
result->num_pages = num_pages;
678679
result->num_index_tuples = num_index_tuples;
679680
result->tuples_removed = tuples_removed;
680-
result->pages_free = 0; /* not computed here */
681681

682682
PG_RETURN_POINTER(result);
683683
}
@@ -746,6 +746,12 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
746746
pageSpaces[nFreePages].avail = BLCKSZ-1;
747747
nFreePages++;
748748
}
749+
pages_deleted++;
750+
}
751+
else if (P_ISDELETED(opaque))
752+
{
753+
/* Already deleted, but can't recycle yet */
754+
pages_deleted++;
749755
}
750756
else if ((opaque->btpo_flags & BTP_HALF_DEAD) ||
751757
P_FIRSTDATAKEY(opaque) > PageGetMaxOffsetNumber(page))
@@ -758,7 +764,10 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
758764
oldcontext = MemoryContextSwitchTo(mycontext);
759765

760766
ndel = _bt_pagedel(rel, buf, info->vacuum_full);
761-
pages_deleted += ndel;
767+
768+
/* count only this page, else may double-count parent */
769+
if (ndel)
770+
pages_deleted++;
762771

763772
/*
764773
* During VACUUM FULL it's okay to recycle deleted pages
@@ -786,6 +795,50 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
786795
_bt_relbuf(rel, buf);
787796
}
788797

798+
/*
799+
* During VACUUM FULL, we truncate off any recyclable pages at the
800+
* end of the index. In a normal vacuum it'd be unsafe to do this
801+
* except by acquiring exclusive lock on the index and then rechecking
802+
* all the pages; doesn't seem worth it.
803+
*/
804+
if (info->vacuum_full && nFreePages > 0)
805+
{
806+
BlockNumber new_pages = num_pages;
807+
808+
while (nFreePages > 0 &&
809+
pageSpaces[nFreePages-1].blkno == new_pages-1)
810+
{
811+
new_pages--;
812+
pages_deleted--;
813+
nFreePages--;
814+
}
815+
if (new_pages != num_pages)
816+
{
817+
int i;
818+
819+
/*
820+
* Okay to truncate.
821+
*
822+
* First, flush any shared buffers for the blocks we intend to
823+
* delete. FlushRelationBuffers is a bit more than we need for
824+
* this, since it will also write out dirty buffers for blocks we
825+
* aren't deleting, but it's the closest thing in bufmgr's API.
826+
*/
827+
i = FlushRelationBuffers(rel, new_pages);
828+
if (i < 0)
829+
elog(ERROR, "btvacuumcleanup: FlushRelationBuffers returned %d",
830+
i);
831+
832+
/*
833+
* Do the physical truncation.
834+
*/
835+
new_pages = smgrtruncate(DEFAULT_SMGR, rel, new_pages);
836+
rel->rd_nblocks = new_pages; /* update relcache immediately */
837+
rel->rd_targblock = InvalidBlockNumber;
838+
num_pages = new_pages;
839+
}
840+
}
841+
789842
/*
790843
* Update the shared Free Space Map with the info we now have about
791844
* free space in the index, discarding any old info the map may have.
@@ -797,13 +850,9 @@ btvacuumcleanup(PG_FUNCTION_ARGS)
797850

798851
MemoryContextDelete(mycontext);
799852

800-
if (pages_deleted > 0)
801-
elog(info->message_level, "Index %s: %u pages, deleted %u; %u now free",
802-
RelationGetRelationName(rel),
803-
num_pages, pages_deleted, nFreePages);
804-
805853
/* update statistics */
806854
stats->num_pages = num_pages;
855+
stats->pages_deleted = pages_deleted;
807856
stats->pages_free = nFreePages;
808857

809858
PG_RETURN_POINTER(stats);

src/backend/access/rtree/rtree.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
*
99
*
1010
* IDENTIFICATION
11-
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.76 2003/02/22 00:45:04 tgl Exp $
11+
* $Header: /cvsroot/pgsql/src/backend/access/rtree/Attic/rtree.c,v 1.77 2003/02/24 00:57:17 tgl Exp $
1212
*
1313
*-------------------------------------------------------------------------
1414
*/
@@ -1248,11 +1248,10 @@ rtbulkdelete(PG_FUNCTION_ARGS)
12481248
/* return statistics */
12491249
num_pages = RelationGetNumberOfBlocks(rel);
12501250

1251-
result = (IndexBulkDeleteResult *) palloc(sizeof(IndexBulkDeleteResult));
1251+
result = (IndexBulkDeleteResult *) palloc0(sizeof(IndexBulkDeleteResult));
12521252
result->num_pages = num_pages;
12531253
result->num_index_tuples = num_index_tuples;
12541254
result->tuples_removed = tuples_removed;
1255-
result->pages_free = 0;
12561255

12571256
PG_RETURN_POINTER(result);
12581257
}

src/backend/commands/vacuum.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
*
1414
*
1515
* IDENTIFICATION
16-
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.249 2003/02/23 20:32:12 tgl Exp $
16+
* $Header: /cvsroot/pgsql/src/backend/commands/vacuum.c,v 1.250 2003/02/24 00:57:17 tgl Exp $
1717
*
1818
*-------------------------------------------------------------------------
1919
*/
@@ -2626,9 +2626,10 @@ scan_index(Relation indrel, double num_tuples)
26262626
stats->num_pages, stats->num_index_tuples,
26272627
false);
26282628

2629-
elog(elevel, "Index %s: Pages %u, %u free; Tuples %.0f.\n\t%s",
2629+
elog(elevel, "Index %s: Pages %u, %u deleted, %u free; Tuples %.0f.\n\t%s",
26302630
RelationGetRelationName(indrel),
2631-
stats->num_pages, stats->pages_free, stats->num_index_tuples,
2631+
stats->num_pages, stats->pages_deleted, stats->pages_free,
2632+
stats->num_index_tuples,
26322633
vac_show_rusage(&ru0));
26332634

26342635
/*
@@ -2687,9 +2688,9 @@ vacuum_index(VacPageList vacpagelist, Relation indrel,
26872688
stats->num_pages, stats->num_index_tuples,
26882689
false);
26892690

2690-
elog(elevel, "Index %s: Pages %u, %u free; Tuples %.0f: Deleted %.0f.\n\t%s",
2691+
elog(elevel, "Index %s: Pages %u, %u deleted, %u free; Tuples %.0f: Deleted %.0f.\n\t%s",
26912692
RelationGetRelationName(indrel),
2692-
stats->num_pages, stats->pages_free,
2693+
stats->num_pages, stats->pages_deleted, stats->pages_free,
26932694
stats->num_index_tuples - keep_tuples, stats->tuples_removed,
26942695
vac_show_rusage(&ru0));
26952696

src/backend/commands/vacuumlazy.c

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
*
3232
*
3333
* IDENTIFICATION
34-
* $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.25 2003/02/23 20:32:12 tgl Exp $
34+
* $Header: /cvsroot/pgsql/src/backend/commands/vacuumlazy.c,v 1.26 2003/02/24 00:57:17 tgl Exp $
3535
*
3636
*-------------------------------------------------------------------------
3737
*/
@@ -586,9 +586,10 @@ lazy_scan_index(Relation indrel, LVRelStats *vacrelstats)
586586
stats->num_pages, stats->num_index_tuples,
587587
false);
588588

589-
elog(elevel, "Index %s: Pages %u, %u free; Tuples %.0f.\n\t%s",
589+
elog(elevel, "Index %s: Pages %u, %u deleted, %u free; Tuples %.0f.\n\t%s",
590590
RelationGetRelationName(indrel),
591-
stats->num_pages, stats->pages_free, stats->num_index_tuples,
591+
stats->num_pages, stats->pages_deleted, stats->pages_free,
592+
stats->num_index_tuples,
592593
vac_show_rusage(&ru0));
593594

594595
pfree(stats);
@@ -641,9 +642,9 @@ lazy_vacuum_index(Relation indrel, LVRelStats *vacrelstats)
641642
stats->num_pages, stats->num_index_tuples,
642643
false);
643644

644-
elog(elevel, "Index %s: Pages %u, %u free; Tuples %.0f: Deleted %.0f.\n\t%s",
645+
elog(elevel, "Index %s: Pages %u, %u deleted, %u free; Tuples %.0f: Deleted %.0f.\n\t%s",
645646
RelationGetRelationName(indrel),
646-
stats->num_pages, stats->pages_free,
647+
stats->num_pages, stats->pages_deleted, stats->pages_free,
647648
stats->num_index_tuples, stats->tuples_removed,
648649
vac_show_rusage(&ru0));
649650

src/include/access/genam.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
* Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
88
* Portions Copyright (c) 1994, Regents of the University of California
99
*
10-
* $Id: genam.h,v 1.38 2003/02/22 00:45:05 tgl Exp $
10+
* $Id: genam.h,v 1.39 2003/02/24 00:57:17 tgl Exp $
1111
*
1212
*-------------------------------------------------------------------------
1313
*/
@@ -34,7 +34,8 @@ typedef struct IndexBulkDeleteResult
3434
BlockNumber num_pages; /* pages remaining in index */
3535
double num_index_tuples; /* tuples remaining */
3636
double tuples_removed; /* # removed by bulk-delete operation */
37-
BlockNumber pages_free; /* # unused pages in index */
37+
BlockNumber pages_deleted; /* # unused pages in index */
38+
BlockNumber pages_free; /* # pages available for reuse */
3839
} IndexBulkDeleteResult;
3940

4041
/* Typedef for callback function to determine if a tuple is bulk-deletable */

0 commit comments

Comments
 (0)