diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2005-03-22 06:17:03 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2005-03-22 06:17:03 +0000 |
commit | 94e03330cbd163378e43094388f87fcba4801ba8 (patch) | |
tree | 29fc477dae5e1be0c985db04ba2cc36389648ec6 /src/backend/access/nbtree/nbtxlog.c | |
parent | 775d28302cda48b3f22a2f4f9067de0cf5192fff (diff) | |
download | postgresql-94e03330cbd163378e43094388f87fcba4801ba8.tar.gz postgresql-94e03330cbd163378e43094388f87fcba4801ba8.zip |
Create a routine PageIndexMultiDelete() that replaces a loop around
PageIndexTupleDelete() with a single pass of compactification ---
logic mostly lifted from PageRepairFragmentation. I noticed while
profiling that a VACUUM that's cleaning up a whole lot of deleted
tuples would spend as much as a third of its CPU time in
PageIndexTupleDelete; not too surprising considering the loop method
was roughly O(N^2) in the number of tuples involved.
Diffstat (limited to 'src/backend/access/nbtree/nbtxlog.c')
-rw-r--r-- | src/backend/access/nbtree/nbtxlog.c | 9 |
1 files changed, 2 insertions, 7 deletions
diff --git a/src/backend/access/nbtree/nbtxlog.c b/src/backend/access/nbtree/nbtxlog.c index 0bd2c418f03..ade60619a3d 100644 --- a/src/backend/access/nbtree/nbtxlog.c +++ b/src/backend/access/nbtree/nbtxlog.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.19 2004/12/31 21:59:22 pgsql Exp $ + * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtxlog.c,v 1.20 2005/03/22 06:17:03 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -411,12 +411,7 @@ btree_xlog_delete(bool redo, XLogRecPtr lsn, XLogRecord *record) unused = (OffsetNumber *) ((char *) xlrec + SizeOfBtreeDelete); unend = (OffsetNumber *) ((char *) xlrec + record->xl_len); - /* be careful to delete from back to front */ - while (unused < unend) - { - unend--; - PageIndexTupleDelete(page, *unend); - } + PageIndexMultiDelete(page, unused, unend - unused); } PageSetLSN(page, lsn); |