Однією з причин віддати перевагу 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