2011-07-07 10 views
6

Tengo una tabla llamada Workflow. Tiene 37 millones de filas. Hay una clave principal en la columna de ID (int) más una columna adicional. La columna ID es la primera columna en el índice.¿Por qué no se usa un índice en particular en una consulta?

Si ejecuto la siguiente consulta, no se utiliza el PK (a menos que utilice una sugerencia de índice)

Select Distinct(SubID) From Workflow Where ID >= @LastSeenWorkflowID 

Si ejecuto esta consulta en cambio, el PK se utiliza

Select Distinct(SubID) From Workflow Where ID >= 786400000 

I sospecho que el problema está en utilizar el valor del parámetro en la consulta (que tengo que hacer). Realmente no quiero usar una pista de índice. ¿Hay una solución para esto?

+0

la versión de SQL Server? –

+0

¿Este es un índice no agrupado? ¿Hay un índice agrupado? – JNK

+0

@JNK - SQL Server 2008 y el PK es un índice agrupado –

Respuesta

3

Por favor, publique el (los) plan (es) de ejecución, así como la definición exacta de la tabla, incluidos todos los índices.

Cuando usa una variable, el optimizador no sabe qué selectividad tendrá la consulta, @LastSeenWorkflowID puede filtrar todas las últimas pero muy pocas filas en Workflow, o puede incluirlas todas. El plan generado tiene que funcionar en ambas situaciones. Hay un umbral en el cual el rango busca sobre el índice agrupado es cada vez más costoso que un análisis completo sobre un índice no agrupado, simplemente porque el índice agrupado es mucho más amplio (incluye todas las columnas en los niveles foliares) y por lo tanto tiene mucho más páginas para iterar. El plan generado, que considera un valor desconocido para @LastSeenWorkflowID, probablemente cruce ese umbral al estimar el costo de la búsqueda del índice agrupado y, como tal, elige el escaneo sobre el índice no agrupado.

Usted puede proporcionar un índice estrecha que está dirigido específicamente a esta consulta:

CREATE INDEX WorkflowSubId ON Workflow(ID, SubId); 

o:

CREATE INDEX WorkflowSubId ON Workflow(ID) INCLUDE (SubId); 

Este índice es demasiado-bueno-a-paso para su búsqueda, sin importa el valor de @LastSeenWorkflowID.

2

Asumiendo que su PK es una identidad o es siempre mayor que 0, tal vez usted podría intentar esto:

Select Distinct(SubID) 
From Workflow 
Where ID >= @LastSeenWorkflowID 
    And ID > 0 

Mediante la adición de la segunda condición, se puede hacer que el optimizador utilice una búsqueda de índice.

Cuestiones relacionadas