Я пытаюсь настроить производительность запроса, который есть у нас в SQL Server 2014 Enterprise.
Я открыл фактический план запроса в SQL Sentry Plan Explorer, и я вижу на одном узле, что у него есть Предикат поиска, а также Предикат
В чем разница между поиском предиката и предиката ?
Примечание: я вижу, что есть много проблем с этим узлом (например, Оцененные против Фактических строк, остаточный ввод-вывод), но вопрос не касается ни одного из этого.
The Seek Predicate can be used to find the start of the RangeScan and then when to stop, while the Predicate is the "check" that is applied to every row in the Range.
Ответы:
Давайте бросим один миллион строк во временную таблицу вместе с несколькими столбцами:
Здесь у меня есть кластерный индекс (по умолчанию) для
PK
столбца. Существует некластеризованный индексCOL1
с ключевым столбцомCOL1
и включает в себяCOL2
.Рассмотрим следующий запрос:
Здесь я не пользуюсь,
BETWEEN
потому что вокруг этого вопроса висит Аарон Бертран.Как оптимизатор SQL Server должен выполнять этот запрос? Ну, я знаю, что фильтр
PK
включит результирующий набор до пяти строк. Сервер SQL может использовать кластерный индекс для перехода к этим пяти строкам вместо чтения всех миллионов строк в таблице. Однако кластерный индекс имеет только столбец PK в качестве ключевого столбца. Как только строка будет считана в память, нам нужно применить фильтрCOL2
. ЗдесьPK
предикат поиска иCOL2
предикат.SQL-сервер находит пять строк, используя предикат поиска, и дополнительно уменьшает эти пять строк до одной строки с обычным предикатом.
Если я определю кластерный индекс по-другому:
И выполнить тот же запрос, я получаю разные результаты:
В этом случае SQL Server может искать, используя оба столбца в
WHERE
предложении. Ровно одна строка читается из таблицы, используя ключевые столбцы.Для еще одного примера рассмотрим этот запрос:
Индекс IX_174860_IX является индексом покрытия, поскольку он содержит все столбцы, необходимые для запроса. Однако только
COL1
ключевой столбец. SQL Server может выполнить поиск по этому столбцу, чтобы найти 1000 строк с соответствующимCOL1
значением. Он может дополнительно отфильтровать эти строки вCOL2
столбце, чтобы уменьшить конечный набор результатов до 0 строк.источник