Una razón para preferir INCLUDEa las columnas clave si no necesita esa columna en la clave es la documentación. Eso hace que la evolución de los índices sea mucho más fácil en el futuro.
Considerando tu ejemplo:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Ese índice es mejor si su consulta se ve así:
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
Por supuesto, no debe colocar columnas INCLUDEsi puede obtener un beneficio adicional al tenerlas en la parte clave. Las dos consultas siguientes preferirían la col2columna en la clave del índice.
SELECT col2, col3
FROM MyTable
WHERE col1 = ...
AND col2 = ...
SELECT TOP 1 col2, col3
FROM MyTable
WHERE col1 = ...
ORDER BY col2
Supongamos que este no es el caso y tenemos col2en la INCLUDEcláusula porque simplemente no hay beneficio de tenerlo en la parte del árbol del índice.
Avance rápido algunos años.
Necesita ajustar esta consulta:
SELECT TOP 1 col2
FROM MyTable
WHERE col1 = ...
ORDER BY another_col
Para optimizar esa consulta, el siguiente índice sería excelente:
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2)
Si verifica qué índices tiene en esa tabla, su índice anterior aún podría estar allí:
CREATE INDEX idx1 ON MyTable (Col1) INCLUDE (Col2, Col3)
Ahora lo sabe Col2y Col3no forma parte del árbol de índice y, por lo tanto, no se utiliza para reducir el rango del índice de lectura ni para ordenar las filas. Es bastante seguro agregarlo another_columnal final de la parte clave del índice (después col1). Hay poco riesgo de romper algo:
DROP INDEX idx1 ON MyTable;
CREATE INDEX idx1 ON MyTable (Col1, another_col) INCLUDE (Col2, Col3);
Ese índice se hará más grande, lo que todavía tiene algunos riesgos, pero generalmente es mejor extender los índices existentes en comparación con la introducción de nuevos.
Si tuviera un índice sin INCLUDE, no podría saber qué consultas rompería agregando another_coljusto después Col1.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
¿Qué sucede si agregas another_colentre Col1y Col2? ¿Otras consultas sufrirán?
Hay otros "beneficios" de INCLUDElas columnas de clave vs. vs. si agrega esas columnas solo para evitar recuperarlas de la tabla . Sin embargo, considero que el aspecto de la documentación es el más importante.
Para responder tu pregunta:
¿Qué pautas sugeriría para determinar si crear un índice de cobertura con o sin la cláusula INCLUDE?
Si agrega una columna al índice con el único propósito de tener esa columna disponible en el índice sin visitar la tabla, póngala en la INCLUDEcláusula.
Si agregar la columna a la clave de índice brinda beneficios adicionales (por ejemplo, para order byo porque puede reducir el rango del índice de lectura), agréguelo a la clave.
Puedes leer una discusión más larga sobre esto aquí:
https://use-the-index-luke.com/blog/2019-04/include-columns-in-btree-indexes