2010-03-05 9 views
8

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' 

Respuesta

6

La consulta siguiente, que es casi idéntica a la consulta anterior, utiliza un recorrido de índice agrupado, en lugar del índice de LastModifiedTime. puede alguien decirme por que?

La consulta siguiente no conoce los valores de los parámetros en la construcción del plan y asume que, en general, , el recorrido de índice agrupado es mejor.

Y, más importante aún, lo que puedo hacer para que SQL Server use el índice en la columna LastModifiedTime, sin usar una sugerencia de índice.

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' 
OPTION (OPTIMIZE FOR (@LastModifiedTimeStart = '3/3/2010', @LastModifiedTimeEnd = '3/4/2010')) 

Alternativamente, se puede añadir OPTION (RECOMPILE), lo que creará el plan de ejecución diferente cada vez que se ejecuta la consulta, tomando los valores de los parámetros en la cuenta (descubrimiento de parámetros).

Esto, sin embargo, no garantiza que se use el índice.

+0

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? –

+0

@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

+0

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) '. –

Cuestiones relacionadas