Как sql-сервер ищет в составном некластеризованном индексе?

Если, например, у меня есть составной некластеризованный индекс, как показано ниже:

CREATE NONCLUSTERED INDEX idx_Test ON dbo.Persons(IsActive, UserName)

В зависимости от этого ответа Насколько важен порядок столбцов в индексах?

Если я запустил этот запрос:

Select * From Persons Where UserName='Smith'

В приведенном выше запросе IsActive отсутствует порядок = 1 в некластеризованном индексе. Означает ли это, что оптимизатор запросов Sql Server игнорирует поиск в индексе, потому что IsActive отсутствует или что?

Конечно, я могу просто протестировать это и проверить план выполнения, и я сделаю это, но мне также интересно узнать о теории, лежащей в основе этого. Когда мощность имеет значение, а когда нет?


person Simple Code    schedule 01.03.2018    source источник
comment
Вы это проверяли? Получите примерный план и посмотрите на оператора справа.   -  person MJH    schedule 01.03.2018


Ответы (1)


SQLServer просканирует общий индекс, в этом случае это может быть самый узкий индекс.

Ниже приведен небольшой пример таблицы заказов, которая у меня есть

введите описание изображения здесь

Предикат запроса (shipperid='G') удовлетворяет требованиям 199748 строк, но sql-сервер должен прочитать общее количество строк (998123), чтобы получить данные. Это видно из количества прочитанных строк до фактического количества строк.

Я нашел это от Крейга Фридмана очень полезным ... Предполагая, что у вас есть индекс на _2 _ .. SQLServer может эффективно сделать ниже

  • а = какое-то значение и б = какое-то значение
  • a = someval и b> 0
  • a = someval и b> = 0

для следующих операций сервер sql выберет фильтрацию как можно большего количества строк по первому предикату (это также причина, по которой вы, возможно, слышали, чтобы сначала сохранить столбец с более уникальными значениями) и будет использовать второй предикат в качестве остаточного
- a> = какое-то значение и b = какое-то значение

в приведенном ниже случае сервер sql должен сканировать весь индекс.

  • b = someval

Дополнительная литература:
Блог Крейга Фридмана по SQL Server: поиск предикатов
Проверить остаток при совпадении хэша - скрытые затраты в планах выполнения: Роб Фарли < br> Ответы на вопрос о переломном моменте: Кимберли Л. Трипп < / а>

person TheGameiswar    schedule 01.03.2018
comment
Так вы имеете в виду, что мне нужно создать отдельный индекс для каждого из них? - person Simple Code; 01.03.2018
comment
Сначала вы должны подумать о запросе, нужно ли мне обеспечивать быстрое выполнение этого запроса как можно скорее ... в этом случае вам необходимо убедиться, что у него правильные индексы ... Это компромисс между производительностью запроса и индексом поддержание - person TheGameiswar; 01.03.2018
comment
Если у меня есть два индекса, один из которых соответствует указанному выше, а другой находится только в столбце UserName для этого запроса. Выберите * From Persons, где UserName = 'Smith', какой индексный сервер sql будет искать? - person Simple Code; 01.03.2018