mirror of
https://github.com/postgres/postgres.git
synced 2025-10-24 01:29:19 +03:00
Rewrite btree index scans to work a page at a time in all cases (both
btgettuple and btgetmulti). This eliminates the problem of "re-finding" the exact stopping point, since the stopping point is effectively always a page boundary, and index items are never moved across pre-existing page boundaries. A small penalty is that the keys_are_unique optimization is effectively disabled (and, therefore, is removed in this patch), causing us to apply _bt_checkkeys() to at least one more tuple than necessary when looking up a unique key. However, the advantages for non-unique cases seem great enough to accept this tradeoff. Aside from simplifying and (sometimes) speeding up the indexscan code, this will allow us to reimplement btbulkdelete as a largely sequential scan instead of index-order traversal, thereby significantly reducing the cost of VACUUM. Those changes will come in a separate patch. Original patch by Heikki Linnakangas, rework by Tom Lane.
This commit is contained in:
@@ -7,7 +7,7 @@
|
||||
* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* $PostgreSQL: pgsql/src/include/access/itup.h,v 1.45 2006/03/05 15:58:53 momjian Exp $
|
||||
* $PostgreSQL: pgsql/src/include/access/itup.h,v 1.46 2006/05/07 01:21:30 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@@ -126,6 +126,17 @@ typedef IndexAttributeBitMapData *IndexAttributeBitMap;
|
||||
) \
|
||||
)
|
||||
|
||||
/*
|
||||
* MaxIndexTuplesPerPage is an upper bound on the number of tuples that can
|
||||
* fit on one index page. An index tuple must have either data or a null
|
||||
* bitmap, so we can safely assume it's at least 1 byte bigger than a bare
|
||||
* IndexTupleData struct. We arrive at the divisor because each tuple
|
||||
* must be maxaligned, and it must have an associated item pointer.
|
||||
*/
|
||||
#define MaxIndexTuplesPerPage \
|
||||
((int) ((BLCKSZ - offsetof(PageHeaderData, pd_linp)) / \
|
||||
(MAXALIGN(sizeof(IndexTupleData) + 1) + sizeof(ItemIdData))))
|
||||
|
||||
|
||||
/* routines in indextuple.c */
|
||||
extern IndexTuple index_form_tuple(TupleDesc tupleDescriptor,
|
||||
|
||||
Reference in New Issue
Block a user