Индекс не используется при выборе поля - PullRequest
0 голосов
/ 31 августа 2018

Я столкнулся со странной ситуацией, когда включение значения в мой список выбора определяет, будет ли мой индекс использоваться при поиске.

У меня есть индекс, созданный для cTable (cf1, cf2, cf3).

В этом первом случае сканирование таблицы выполняется на cTable:

select
    a.bkey
    ,c.mappedvalue
from
    aTable a
    LEFT JOIN bTable b
       ON b.bkey = a.bkey
    LEFT JOIN cTable c ON (
        c.[cf1] = b.[cf1] and
        c.[cf2] = b.[cf2] and
        c.[cf3] = a.[cf3]
    )
;

Однако, когда я удаляю столбец сопоставленного значения из списка выбора, используется индекс:

select
    a.bkey
    --,c.mappedvalue
from
    aTable a
    LEFT JOIN bTable b
       ON b.bkey = a.bkey
    LEFT JOIN cTable c ON (
        c.[cf1] = b.[cf1] and
        c.[cf2] = b.[cf2] and
        c.[cf3] = a.[cf3]
    )
;

Кто-нибудь сталкивался с этим? Оптимизатор просто решает избежать индекса?

1 Ответ

0 голосов
/ 31 августа 2018

Когда вы удаляете столбец, тогда ваш индекс покрывает индекс .

select
    a.bkey
    --,c.mappedvalue
from
    aTable a
    LEFT JOIN bTable b
       ON b.bkey = a.bkey
    LEFT JOIN cTable c ON (
        c.[cf1] = b.[cf1] and
        c.[cf2] = b.[cf2] and
        c.[cf3] = a.[cf3]
    )
;

Вы можете добавить INCLUDE:

 CREATE INDEX idx ON cTable(cf1,cf2,cf3) INCLUDE (mappedvalue);

Тогда запрос:

select
    a.bkey
    ,c.mappedvalue
from
    aTable a
    LEFT JOIN bTable b
       ON b.bkey = a.bkey
    LEFT JOIN cTable c ON (
        c.[cf1] = b.[cf1] and
        c.[cf2] = b.[cf2] and
        c.[cf3] = a.[cf3]
    )
;

следует использовать индекс idx.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...