2011-05-26 9 views
7

Tengo una consulta compleja en una base de datos con malas estadísticas e índices fragmentados. Lo que me deja perplejo es que cuando examino un plan de consulta real obtengo 54 M filas de un escaneo de tabla en una tabla que tiene 23 K filas. Mucho más arriba en el plan de consulta esta tabla se une contra sí misma (solo 260 K filas de 23 K). ¿Cómo es esto posible?¿Cómo puede una exploración de tabla devolver más filas de las que están en la tabla?

Ejecutar algunas otras consultas o reconstruir índices y estadísticas hace que esto desaparezca, solo estoy tratando de entender por qué sucedería esto.

He reproducido esto con SQL 2005 y SQL 2008 R2 en una restauración de la misma base de datos.

Actualización: Sí, este es un plan real. El número de filas es 20039 (no 23 K como se mencionó anteriormente). Este es uno de los nodos más a la derecha.

+0

Hmmm ... ¿se está escaneando la tabla varias veces? –

+0

La tabla está auto unida en la consulta por buenas razones. En el plan de consulta, se escanea dos veces (Escaneo de tabla mencionado anteriormente) y también tres búsquedas de índices en la tabla. – PavelR

+0

¿Este es el plan de ejecución estimado o el plan de ejecución real? – Ryk

Respuesta

5

Parece como si este nodo en el plan de ejecución es la tabla de "segunda" involucrado en un bucle anidado, con 2701 filas en la "primera" mesa (gracias Martin!).

Como parece que no hay un índice apropiado en la tabla HistoricalPrice, se debe analizar el montón para cada fila en la unión de bucle, lo que da como resultado un total de 2701 * 20039 = 54,125,339 filas. El número de filas que salen del operador de bucle anidado será el número total de filas unidas/coincidentes.

Mientras que el plan de ejecución solo muestra la tabla a la que se accede como un nodo, la unión de bucle terminaría accediendo a esa tabla tantas veces como filas. Sin un índice, se debe escanear toda la tabla, lo que devuelve 20.039 filas al operador de bucle anidado cada vez.

Si se colocó un índice apropiado en la tabla para sustentar la unión, entonces quizás solo se busque una sola fila y, por lo tanto, se envíe un número menor de filas al bucle anidado.

+0

Sí, más arriba en el árbol hay un bucle anidado con el otro lado solicitando 2701 filas. – PavelR

Cuestiones relacionadas