Revert buggy optimization of index scans
authorSimon Riggs <simon@2ndQuadrant.com>
Thu, 3 Mar 2016 09:53:43 +0000 (09:53 +0000)
committerSimon Riggs <simon@2ndQuadrant.com>
Thu, 3 Mar 2016 09:53:43 +0000 (09:53 +0000)
606c0123d627 attempted to reduce cost of index scans using > and <
strategies, though got that completely wrong in a few complex cases.

Revert whole patch until we find a safe optimization.

src/backend/access/nbtree/nbtsearch.c
src/backend/access/nbtree/nbtutils.c
src/include/access/nbtree.h

index 3db32e8d560242290a2cc2e57a982c2ac5890335..14dffe07db6940169f5db029f9450ad214804815 100644 (file)
@@ -1026,33 +1026,6 @@ _bt_first(IndexScanDesc scan, ScanDirection dir)
    if (goback)
        offnum = OffsetNumberPrev(offnum);
 
-   /*
-    * By here the scan position is now set for the first key.  If all further
-    * tuples are expected to match we set the SK_BT_MATCHED flag to avoid
-    * re-checking the scan key later.  This is a big win for slow key matches
-    * though is still significant even for fast datatypes.
-    */
-   switch (startKeys[0]->sk_strategy)
-   {
-       case BTEqualStrategyNumber:
-           break;
-
-       case BTGreaterEqualStrategyNumber:
-       case BTGreaterStrategyNumber:
-           if (ScanDirectionIsForward(dir))
-               startKeys[0]->sk_flags |= SK_BT_MATCHED;
-           break;
-
-       case BTLessEqualStrategyNumber:
-       case BTLessStrategyNumber:
-           if (ScanDirectionIsBackward(dir))
-               startKeys[0]->sk_flags |= SK_BT_MATCHED;
-           break;
-
-       default:
-           break;
-   }
-
    /* remember which buffer we have pinned, if any */
    Assert(!BTScanPosIsValid(so->currPos));
    so->currPos.buf = buf;
index c850b4804fe99f6f364af8f474d267e46dd5cc35..b714b2c2fb68b7353190d19e9841266ee29990ed 100644 (file)
@@ -1429,13 +1429,6 @@ _bt_checkkeys(IndexScanDesc scan,
        bool        isNull;
        Datum       test;
 
-       /*
-        * If the scan key has already matched we can skip this key, as long
-        * as the index tuple does not contain NULL values.
-        */
-       if (key->sk_flags & SK_BT_MATCHED && !IndexTupleHasNulls(tuple))
-           continue;
-
        /* row-comparison keys need special processing */
        if (key->sk_flags & SK_ROW_HEADER)
        {
index 06822fac3c4282891581cee7f6a0ebc6be95f210..9046b166bd9a56262f9cd02fd22b5a365307b64b 100644 (file)
@@ -646,7 +646,6 @@ typedef BTScanOpaqueData *BTScanOpaque;
  */
 #define SK_BT_REQFWD   0x00010000      /* required to continue forward scan */
 #define SK_BT_REQBKWD  0x00020000      /* required to continue backward scan */
-#define SK_BT_MATCHED  0x00040000      /* required to skip further key match */
 #define SK_BT_INDOPTION_SHIFT  24      /* must clear the above bits */
 #define SK_BT_DESC         (INDOPTION_DESC << SK_BT_INDOPTION_SHIFT)
 #define SK_BT_NULLS_FIRST  (INDOPTION_NULLS_FIRST << SK_BT_INDOPTION_SHIFT)