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)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy