BUG #6283: About the behavior of indexscan in case there are some NULL values.

Поиск
Список
Период
Сортировка
От Naoya Anzai
Тема BUG #6283: About the behavior of indexscan in case there are some NULL values.
Дата
Msg-id 201111020444.pA24iN5a031950@wwwmaster.postgresql.org
обсуждение исходный текст
Список pgsql-bugs
The following bug has been logged online:

Bug reference:      6283
Logged by:          Naoya Anzai
Email address:      anzai-naoya@mxu.nes.nec.co.jp
PostgreSQL version: 9.1.1
Operating system:   RHEL5.5
Description:        About the behavior of indexscan in case there are some
NULL values.
Details:

Hello,

In the newest PostgreSQL(9.1.1) or lower, Index-Scan's actual time may
increase unexpectedly.

I think that this is for scanning All NULL VALUES when performing an
indexscan
even if they does not need to be scanned.

I think that the cause is here.

[src/backend/access/nbtree/nbtutils.c(L963-L996) in PostgreSQL9.1.1]
--------
if (isNull)
{
     if (key->sk_flags & SK_BT_NULLS_FIRST)
     {
             /*
              * Since NULLs are sorted before non-NULLs, we know we have
              * reached the lower limit of the range of values for this
              * index attr.  On a backward scan, we can stop if this qual
              * is one of the "must match" subset.  On a forward scan,
              * however, we should keep going.
              */
             if ((key->sk_flags & SK_BT_REQBKWD) &&
                     ScanDirectionIsBackward(dir))
                     *continuescan = false;
     }
     else
     {
             /*
              * Since NULLs are sorted after non-NULLs, we know we have
              * reached the upper limit of the range of values for this
              * index attr.  On a forward scan, we can stop if this qual is
              * one of the "must match" subset.      On a backward scan,
              * however, we should keep going.
              */
             if ((key->sk_flags & SK_BT_REQFWD) &&
                     ScanDirectionIsForward(dir))
                     *continuescan = false;
     }
        /*
         * In any case, this indextuple doesn't match the qual.
         */
        return false;
}
---------
For example, with NULLS_LAST, GREATER THAN scan key('value > scankey' etc.),
and FORWARD SCAN conditions,
even if scan have reached a NULL value, continuescan is still true all the
time.

If it rewrites as follows, I think that this problem is solved, but how is
it?
--------

--- nbtutils.c  2011-11-02 14:10:55.000000000 +0900
+++ nbtutils.c.new      2011-11-02 14:11:38.000000000 +0900
@@ -971,8 +971,7 @@
                                 * is one of the "must match" subset.  On a
forward scan,
                                 * however, we should keep going.
                                 */
-                               if ((key->sk_flags & SK_BT_REQBKWD) &&
-                                       ScanDirectionIsBackward(dir))
+                               if (ScanDirectionIsBackward(dir))
                                        *continuescan = false;
                        }
                        else
@@ -984,8 +983,7 @@
                                 * one of the "must match" subset.      On a
backward scan,
                                 * however, we should keep going.
                                 */
-                               if ((key->sk_flags & SK_BT_REQFWD) &&
-                                       ScanDirectionIsForward(dir))
+                               if (ScanDirectionIsForward(dir))
                                        *continuescan = false;
                        }

---------

Regards,
Naoya Anzai

В списке pgsql-bugs по дате отправления:

Предыдущее
От: ""
Дата:
Сообщение: BUG #6282: psql.exe cannot recognize specific 2byte SJIS character
Следующее
От: Itagaki Takahiro
Дата:
Сообщение: Re: BUG #6282: psql.exe cannot recognize specific 2byte SJIS character