Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit0797bb5

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 movenondeletable pages, but it's better than nothing. Also, improve statsdisplayed during VACUUM VERBOSE.
1 parent3981f21 commit0797bb5

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+
elseif (P_ISDELETED(opaque))
752+
{
753+
/* Already deleted, but can't recycle yet */
754+
pages_deleted++;
749755
}
750756
elseif ((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+
BlockNumbernew_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+
inti;
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, %udeleted, %ufree; 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, %udeleted, %ufree; 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, %udeleted, %ufree; 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, %udeleted, %ufree; 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
BlockNumbernum_pages;/* pages remaining in index */
3535
doublenum_index_tuples;/* tuples remaining */
3636
doubletuples_removed;/* # removed by bulk-delete operation */
37-
BlockNumberpages_free;/* # unused pages in index */
37+
BlockNumberpages_deleted;/* # unused pages in index */
38+
BlockNumberpages_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)

[8]ページ先頭

©2009-2025 Movatter.jp