Обратите внимание, порядок столбцов в моих индексах немного отличается от вашего!
TLDR;- перейдите к практическому правилу в конце ответа, если вы недостаточно терпеливы, чтобы прочитать ответ.
Сценарий # 1:
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)
Здесь приведены все значенияв 3 столбцах A, B и C будут частью ключа поиска. Следовательно, если ваш запрос написан так:
SELECT A, B, C
FROM TABLE
WHERE A = 1
AND B = 0
AND C = 3;
или аналогичный, он будет использовать индекс, поскольку все столбцы, по которым вы фильтруете, являются частью индекса KEY (Столбцы A, B, C).
Однако во втором сценарии ( обратите внимание, что столбцы B находятся в первом паратезе, который идентифицирует индекс KEY ):
CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
с использованием немного другого запроса, где мы не фильтруем по индексному ключу , в данном случае столбец "B":
SELECT A, B, C
FROM TABLE
WHERE A = 1
AND C = 0;
Наш запрос не будет использовать индекс и приведет к полному сканированию таблицы.
Дело в том, что если вы всегда пишете запрос, в котором вы фильтруете по столбцам в INDEX KEY, то ваш индексбудет использован ваш запрос будет выполняться быстрее!
В сценарии CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
необходимо понимать следующие различия:
- B - index KEY (only the values in the B column are used to build the structure of the search tree)
- A, C - values included along with the index KEY (they are not used in deciding the structure of the search tree, they are attached/included at each leaf level, along with the index KEY so that you do not have to do a lookup for these column values)
Если у нас есть следующая таблица с данными, если мысоздайте индекс из 2-го сценария , как показано ниже:
Тогда древовидная структура поиска, созданная за сценой, которая будет поддерживать ваш запрос фильтра (WHERE), будет выглядеть следующим образом:
Практическое правило:
Если вам когда-либо придется написать запрос, например:
SELECT A, B, C
FROM table
WHERE B = 0;
лучше создать индекс, например: CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (B) INCLUDE (A,C)
Но если вам когда-нибудь придется написать запрос, например:
SELECT A, B, C
FROM table
WHERE A = 0
AND B = 1
AND C = 3;
Тогда лучше создать индекс, например CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)