aboutsummaryrefslogtreecommitdiff
path: root/src/backend/access
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2005-03-22 06:17:03 +0000
committerTom Lane <tgl@sss.pgh.pa.us>2005-03-22 06:17:03 +0000
commit94e03330cbd163378e43094388f87fcba4801ba8 (patch)
tree29fc477dae5e1be0c985db04ba2cc36389648ec6 /src/backend/access
parent775d28302cda48b3f22a2f4f9067de0cf5192fff (diff)
downloadpostgresql-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')
-rw-r--r--src/backend/access/nbtree/nbtpage.c11
-rw-r--r--src/backend/access/nbtree/nbtxlog.c9
2 files changed, 5 insertions, 15 deletions
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 3e2a9010a44..2b82a87a1d4 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -9,7 +9,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.81 2004/12/31 21:59:22 pgsql Exp $
+ * $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.82 2005/03/22 06:17:03 tgl Exp $
*
* NOTES
* Postgres btree pages look like ordinary relation pages. The opaque
@@ -639,17 +639,12 @@ _bt_delitems(Relation rel, Buffer buf,
OffsetNumber *itemnos, int nitems)
{
Page page = BufferGetPage(buf);
- int i;
/* No ereport(ERROR) until changes are logged */
START_CRIT_SECTION();
- /*
- * Delete the items in reverse order so we don't have to think about
- * adjusting item numbers for previous deletions.
- */
- for (i = nitems - 1; i >= 0; i--)
- PageIndexTupleDelete(page, itemnos[i]);
+ /* Fix the page */
+ PageIndexMultiDelete(page, itemnos, nitems);
/* XLOG stuff */
if (!rel->rd_istemp)
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);