La siguiente consulta utiliza una búsqueda de índice en un índice en la columna LastModifiedTime.Búsqueda de índice versus exploración de índice agrupado: ¿por qué se elige el escaneo?
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN '3/3/2010' And '3/4/2010'
AND a.SubAssembly = '400'
La consulta siguiente, que es casi idéntica a la consulta anterior, utiliza un recorrido de índice agrupado, en lugar del índice en lastModifiedTime. puede alguien decirme por que? Y, lo que es más importante, lo que puedo hacer para que SQL Server use el índice en la columna LastModifiedTime, sin usando una sugerencia de índice.
Declare @LastModifiedTimeEnd dateTime
Declare @LastModifiedTimeStart dateTime
SELECT
CONVERT(varchar, a.ReadTime, 101) as ReadDate,
a.SubID,
a.PlantID,
a.Unit as UnitID,
a.SubAssembly
FROM dbo.Accepts a WITH (NOLOCK)
WHERE a.LastModifiedTime BETWEEN @LastModifiedTimeStart And @LastModifiedTimeEnd
AND a.SubAssembly = '400'
No estoy seguro de por qué el planificador de consultas asumiría que el índice agrupado es mejor. Independientemente de cuáles sean los parámetros, aún coincide con una columna específica que tiene un índice creado para ella. ¿Cuál es el sentido de ese índice si solo se usa con parámetros fijos? –
@Kent: utilizar un índice secundario para recuperar un rango de valores requiere volver a unir el índice a la tabla. Cuando el rango es grande, la sobrecarga de unión supera a la sobrecarga de clasificación. – Quassnoi
Ya veo, gracias. Supongo que asumí que el olfateo de parámetros sería un comportamiento predeterminado. Presumiblemente, el uso de '> = @LastModifiedTimeStart AND <= LastModifiedTimeEnd' también impediría el uso del índice no agrupado sin especificar' OPTION (RECOMPILE) '. –