Una razón para preferir INCLUDE
a 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 INCLUDE
si puede obtener un beneficio adicional al tenerlas en la parte clave. Las dos consultas siguientes preferirían la col2
columna 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 col2
en la INCLUDE
clá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 Col2
y Col3
no 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_column
al 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_col
justo después Col1
.
CREATE INDEX idx1 ON MyTable (Col1, Col2, Col3)
¿Qué sucede si agregas another_col
entre Col1
y Col2
? ¿Otras consultas sufrirán?
Hay otros "beneficios" de INCLUDE
las 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 INCLUDE
cláusula.
Si agregar la columna a la clave de índice brinda beneficios adicionales (por ejemplo, para order by
o 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