]> granicus.if.org Git - postgresql/commitdiff
Avoid unnecessary palloc overhead in _bt_first(). The temporary
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 19 Jun 2005 22:41:00 +0000 (22:41 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 19 Jun 2005 22:41:00 +0000 (22:41 +0000)
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 ...

src/backend/access/nbtree/nbtsearch.c

index 824d5ea70e66b51b232d50f0358012c9832d399c..42bd6574aafb84b1ddd75200f81c57e6441e391b 100644 (file)
@@ -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