Индекс с включением в SQL Server - PullRequest
0 голосов
/ 30 октября 2019

В чем разница между

CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A) INCLUDE (B,C)

и

CREATE NONCLUSTERED INDEX IX_NAME1 ON TABLE1 (A,B,C)

И какой запрос SELECT покажет мне эту разницу?

1 Ответ

3 голосов
/ 30 октября 2019

Обратите внимание, порядок столбцов в моих индексах немного отличается от вашего!

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-го сценария , как показано ниже:

enter image description here

Тогда древовидная структура поиска, созданная за сценой, которая будет поддерживать ваш запрос фильтра (WHERE), будет выглядеть следующим образом:

enter image description here


Практическое правило:

Если вам когда-либо придется написать запрос, например:

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)

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