Aquí podría ser tu PUBLICIDAD


Por favor explique el plan de consulta que el servidor SQL elige

votos
3

En esta publicación de blog , necesito aclaraciones sobre por qué el servidor SQL elegiría un tipo particular de análisis:

Supongamos, por simplicidad, que col1 es único y tiene un valor cada vez mayor, col2 tiene 1000 valores distintos y hay 10.000.000 filas en la tabla, y el índice agrupado está formado por col1, y existe un índice no agrupado en col2.

Imagine el plan de ejecución de consulta creado para los siguientes parámetros pasados ​​inicialmente: @ P1 = 1 @ P2 = 99

Estos valores darían lugar a un plan de consulta óptimo para la siguiente declaración que utiliza los parámetros sustituidos:

Seleccione * de t donde col1> 1 o col2

99 orden por col1;

Ahora imagine el plan de ejecución de la consulta si los valores de los parámetros iniciales fueran: @ P1 = 6,000,000 y @ P2 = 550.

Como antes, se crearía un plan de consulta óptimo después de sustituir los parámetros pasados:

Seleccione * de t donde col1> 6000000 o col2> 550 ordene por col1;

Estas dos sentencias SQL parametrizadas idénticas podrían crear y almacenar en caché planes de ejecución muy diferentes debido a la diferencia de los valores de parámetros pasados ​​inicialmente. Sin embargo, dado que SQL Server solo almacena en caché un plan de ejecución por consulta, hay muchas posibilidades de que, en el primer caso, el plan de ejecución de la consulta utilice un análisis de índice agrupado debido a la sustitución del parámetro 'col1> 1'. Mientras que, en el segundo caso, lo más probable es que se cree un plan de ejecución de consultas usando la búsqueda de índice.

desde: http://blogs.msdn.com/sqlprogrammability/archive/2008/11/26/optimize-for-unknown-a-little-known-sql-server-2008feature.aspx

¿Por qué la primera consulta usaría un índice agrupado y una búsqueda de índice en la segunda consulta?

Publicado el 12/03/2009 a las 15:41
fuente por usuario bigint
En otros idiomas...        العربية       

3 respuestas

votos
1

Tenga en cuenta que en ambos casos se usará el índice agrupado. En el primer ejemplo, se trata de un SCAN de índice agrupado donde, como en el segundo ejemplo, se tratará de un índice agrupado SEEK que, en la mayoría de los casos, será más rápido, como afirma el autor del blog.

SQL Server sabe que el índice agrupado está aumentando. Por lo tanto, hará un escaneo de índice agrupado en el primer caso.

Respondida el 12/03/2009 a las 03:52
fuente por usuario Jakob Christensen


Aquí podría ser tu PUBLICIDAD


votos
1

En los casos en que el optimizador vea que la mayoría de la tabla se devolverá en la consulta, como la primera consulta, entonces es más eficiente realizar un escaneo que una búsqueda.

Donde solo se devolverá una pequeña parte de la tabla, como en la segunda consulta, entonces una búsqueda de índice es más eficiente.

Un escaneo tocará cada fila en la tabla, ya sea que califique o no. El costo es proporcional al número total de filas en la tabla. Un escaneo es una estrategia eficiente si la tabla es pequeña o si la mayoría de las filas califican para el predicado.

Una búsqueda tocará las filas que califiquen y las páginas que contengan estas filas calificativas, el costo es proporcional al número de filas y páginas calificadas en lugar de a la cantidad total de filas en la tabla.

Respondida el 12/03/2009 a las 03:49
fuente por usuario Nick Kavadias

votos
1

Suponiendo que las columnas contienen solo enteros positivos:

SQL Server vería las estadísticas de la tabla y vería que, para la primera consulta, todas las filas de la tabla cumplen los criterios de col1> 1, por lo que elige escanear el índice agrupado.

Para la segunda consulta, una proporción relativamente pequeña de filas cumpliría los criterios de col1> 6000000, por lo que el uso de una búsqueda de índice mejoraría el rendimiento.

Respondida el 12/03/2009 a las 03:44
fuente por usuario Ian Nelson