Однією з причин віддати перевагу INCLUDE
над стовпчиками ключів, якщо вам не потрібен цей стовпець у ключі, є документація. Це робить індекси, що розвиваються, набагато простішими в майбутньому.
Розглядаючи ваш приклад:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Цей індекс найкраще, якщо ваш запит виглядає так:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
Звичайно, вам не слід ставити стовпці, INCLUDE
якщо ви зможете отримати додаткову вигоду від наявності їх у ключовій частині. Обидва наступні запити фактично віддають перевагу col2
стовпцю в ключі індексу.
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
Припустимо, що це не так, і ми маємо це col2
в INCLUDE
пункті, оскільки просто немає користі від того, щоб це було в деревній частині індексу.
Швидкий вперед кілька років.
Потрібно налаштувати цей запит:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
Для оптимізації цього запиту чудовим буде такий індекс:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
Якщо ви перевірите, які індекси вже є у цій таблиці, ваш попередній індекс може все ще бути там:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Тепер ви знаєте , що Col2
і Col3
не є частиною індексного дерева і, таким чином , не використовуються , щоб звузити діапазон індексів для читання , ні для упорядкування рядків. Досить безпечно додати another_column
до кінця ключову частину індексу (після col1
). Малий ризик щось зламати:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
Цей індекс стане більшим, що все ще має певні ризики, але, як правило, краще розширити існуючі індекси порівняно із впровадженням нових.
Якщо у вас не буде індексу INCLUDE
, ви не могли б знати, які запити ви порушите, додавши another_col
відразу після Col1
.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
Що станеться, якщо додати another_col
між Col1
і Col2
? Чи страждатимуть інші запити?
Є й інші "переваги" INCLUDE
стовпців порівняно з клавішами, якщо ви додаєте ці стовпчики просто, щоб уникнути їх отримання з таблиці . Однак я вважаю аспект документації найважливішим.
Щоб відповісти на ваше запитання:
які вказівки ви б запропонували, визначаючи, чи створювати індекс покриття з або без пункту INCLUDE?
Якщо ви додаєте стовпець до індексу з єдиною метою, щоб цей стовпець був доступний в індексі, не відвідуючи таблицю, введіть його в INCLUDE
пункт.
Якщо додавання стовпчика до індексного ключа приносить додаткові переваги (наприклад, для order by
або тому, що це може звузити діапазон індексу зчитування), додайте його до ключа.
Ви можете прочитати довшу дискусію з цього приводу тут:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes