Выполнение SQL предпочитает сканирование вместо поиска - PullRequest
0 голосов
/ 24 мая 2018

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

Execution plan scan over seek:

SELECT p.ID, p.[Date]
FROM PurchaseListT as p
WHERE p.[Date] >= '20180507' AND p.[Date] < '20180524' 

enter image description here

1 Ответ

0 голосов
/ 24 мая 2018

В этом случае вы, вероятно, не имеете некластеризованного индекса в поле даты.

Вы заметите, что в вашем плане запросов показано сканирование кластерного индекса.Я сомневаюсь, что ваш кластеризованный индекс находится в поле «Дата», скорее всего, в вашем поле «Идентификатор».

Без индекса в поле «Дата» механизм поиска SEEK отсутствует.Вместо этого он проходит через кластеризованный индекс, и для каждой записи оценивается, соответствует ли значение Date вашему предложению WHERE (это сканирование).

Если у вас действительно есть индекс Date, оптимизаторВозможно, было решено, что исходя из размера таблицы, вы все же быстрее сканируете кластеризованный индекс, чем искать некластеризованный, а затем ищите другие запрошенные значения столбцов из кластерного индекса.Это еще один признак того, что у вас просто нет индекса на дату, потому что это будет означать, что у вас есть кластерный индекс на что-то, кроме Id.Невероятный сценарий, если вы запросили только идентификатор и дату, а план выполняет сканирование кластерного индекса, а не сканирование таблицы.

...