Avoid unnecessary palloc overhead in _bt_first(). The temporary
scankeys arrays that it needs can never have more than INDEX_MAX_KEYS entries, so it's reasonable to just allocate them as fixed-size local arrays, and save the cost of palloc/pfree. Not a huge savings, but a cycle saved is a cycle earned ...
This commit is contained in:
parent
fc654583ab
commit
d961a56899
@ -8,7 +8,7 @@
|
||||
* Portions Copyright (c) 1994, Regents of the University of California
|
||||
*
|
||||
* IDENTIFICATION
|
||||
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.92 2005/06/13 23:14:48 tgl Exp $
|
||||
* $PostgreSQL: pgsql/src/backend/access/nbtree/nbtsearch.c,v 1.93 2005/06/19 22:41:00 tgl Exp $
|
||||
*
|
||||
*-------------------------------------------------------------------------
|
||||
*/
|
||||
@ -495,8 +495,8 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
bool nextkey;
|
||||
bool goback;
|
||||
bool continuescan;
|
||||
ScanKey scankeys;
|
||||
ScanKey *startKeys = NULL;
|
||||
ScanKey startKeys[INDEX_MAX_KEYS];
|
||||
ScanKeyData scankeys[INDEX_MAX_KEYS];
|
||||
int keysCount = 0;
|
||||
int i;
|
||||
StrategyNumber strat_total;
|
||||
@ -552,8 +552,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
ScanKey chosen;
|
||||
ScanKey cur;
|
||||
|
||||
startKeys = (ScanKey *) palloc(so->numberOfKeys * sizeof(ScanKey));
|
||||
|
||||
/*
|
||||
* chosen is the so-far-chosen key for the current attribute, if
|
||||
* any. We don't cast the decision in stone until we reach keys
|
||||
@ -636,18 +634,14 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
* scan from there.
|
||||
*/
|
||||
if (keysCount == 0)
|
||||
{
|
||||
if (startKeys)
|
||||
pfree(startKeys);
|
||||
return _bt_endpoint(scan, dir);
|
||||
}
|
||||
|
||||
/*
|
||||
* We want to start the scan somewhere within the index. Set up a
|
||||
* 3-way-comparison scankey we can use to search for the boundary
|
||||
* point we identified above.
|
||||
*/
|
||||
scankeys = (ScanKey) palloc(keysCount * sizeof(ScanKeyData));
|
||||
Assert(keysCount <= INDEX_MAX_KEYS);
|
||||
for (i = 0; i < keysCount; i++)
|
||||
{
|
||||
ScanKey cur = startKeys[i];
|
||||
@ -657,12 +651,7 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
* code later
|
||||
*/
|
||||
if (cur->sk_flags & SK_ISNULL)
|
||||
{
|
||||
pfree(startKeys);
|
||||
pfree(scankeys);
|
||||
elog(ERROR, "btree doesn't support is(not)null, yet");
|
||||
return false;
|
||||
}
|
||||
|
||||
/*
|
||||
* If scankey operator is of default subtype, we can use the
|
||||
@ -699,8 +688,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
}
|
||||
}
|
||||
|
||||
pfree(startKeys);
|
||||
|
||||
/*
|
||||
* Examine the selected initial-positioning strategy to determine
|
||||
* exactly where we need to start the scan, and set flag variables to
|
||||
@ -809,7 +796,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
/* Only get here if index is completely empty */
|
||||
ItemPointerSetInvalid(current);
|
||||
so->btso_curbuf = InvalidBuffer;
|
||||
pfree(scankeys);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -823,9 +809,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
|
||||
blkno = BufferGetBlockNumber(buf);
|
||||
ItemPointerSet(current, blkno, offnum);
|
||||
|
||||
/* done with manufactured scankey, now */
|
||||
pfree(scankeys);
|
||||
|
||||
/*
|
||||
* If nextkey = false, we are positioned at the first item >= scan
|
||||
* key, or possibly at the end of a page on which all the existing
|
||||
|
Loading…
Reference in New Issue
Block a user