Tengo una pregunta bastante simple:SQL Server no utilizará mi índice
SELECT
col1,
col2…
FROM
dbo.My_Table
WHERE
col1 = @col1 AND
col2 = @col2 AND
col3 <= @col3
Se estaba realizando horrible, por lo que añade un índice en col1, col2, col3 (int, poco, y de fecha y hora). Cuando revisé el plan de consulta estaba ignorando mi índice. Intenté reordenar las columnas en el índice en todas las configuraciones posibles y siempre ignoré el índice. Cuando ejecuto la consulta, realiza un análisis de índice agrupado (el tamaño de la tabla está entre 700K y 800K filas) y demora de 10 a 12 segundos. Cuando lo obligo a usar mi índice, regresa al instante. Tuve el cuidado de borrar el caché y los búferes entre las pruebas.
Otras cosas que he intentado:
UPDATE STATISTICS dbo.My_Table
CREATE STATISTICS tmp_stats ON dbo.My_Table (col1, col2, col3) WITH FULLSCAN
Me estoy perdiendo algo aquí? Odio poner una sugerencia de índice en un procedimiento almacenado, pero SQL Server parece que no puede obtener una pista sobre este. ¿Alguien sabe alguna otra cosa que pueda evitar que SQL Server reconozca que usar el índice es una buena idea?
EDIT: Una de las columnas que se devuelve es una columna TEXT, así que usar un índice de cobertura o un INCLUDE no funcionará :(
Pone una elipsis en su lista de columnas, ¿qué otras columnas está seleccionando? ¿Y si solo fuera col1, col2 y col3? –
Chris, buen punto, pero "cuando lo obligo a usar mi índice vuelve al instante" cubre eso. –
Las elipsis se deben a que la consulta devuelve todas las columnas de la tabla. Supongo que podría haber puesto SELECT * –