Hubiera adivinado que cuando una consulta incluye TOP n, el motor de la base de datos ejecuta la consulta ignorando la cláusula TOP, y luego al final simplemente reduce ese resultado establecido en el número n de filas que se solicitó. El plan de ejecución gráfico parece indicar que este es el caso: TOP es el "último" paso. Pero parece que están sucediendo más.
La forma en que se expresa lo anterior me hace pensar que puede tener una imagen mental incorrecta de cómo se ejecuta una consulta. Un operador en un plan de consulta no es un paso (donde el conjunto de resultados completo de un paso anterior es evaluado por el siguiente.
SQL Server utiliza un modelo de ejecución canalizado , donde cada operador expone métodos como Init () , GetRow () y Close () . Como sugiere el nombre GetRow () , un operador produce una fila a la vez a pedido (según lo requiera su operador principal). Esto está documentado en la referencia de Operadores físicos y lógicos de los Libros en línea , con más detalles en la publicación de mi blog Por qué los planes de consulta se ejecutan al revés . Este modelo de fila a la vez es esencial para formar una intuición sólida para la ejecución de consultas.
Mi pregunta es, ¿cómo (y por qué) una TOP
cláusula n impacta el plan de ejecución de una consulta?
Algunas operaciones lógicas como TOP
, semiuniones y la FAST n
sugerencia de consulta afectan la forma en que el optimizador de consultas cuesta alternativas de plan de ejecución. La idea básica es que una posible forma de plan podría devolver las primeras n filas más rápidamente que un plan diferente que se optimizó para devolver todas las filas.
Por ejemplo, la unión de bucles anidados indexados es a menudo la forma más rápida de devolver una pequeña cantidad de filas, aunque la combinación hash o fusionada con escaneos puede ser más eficiente en conjuntos más grandes. La forma en que el optimizador de consultas razona sobre estas opciones es estableciendo un Objetivo de fila en un punto particular del árbol lógico de operaciones.
Un objetivo de fila modifica la forma en que se calculan las alternativas del plan de consulta. La esencia de esto es que el optimizador comienza costando a cada operador como si se requiriera el conjunto de resultados completo, establece un objetivo de fila en el punto apropiado y luego retrocede en el árbol del plan estimando el número de filas que espera examinar. para cumplir el objetivo de la fila.
Por ejemplo, un lógico TOP(10)
establece un objetivo de fila de 10 en un punto particular del árbol de consulta lógica. Los costos de los operadores que conducen al objetivo de la fila se modifican para estimar cuántas filas necesitan producir para alcanzar el objetivo de la fila. Este cálculo puede volverse complejo, por lo que es más fácil entender todo esto con un ejemplo completamente trabajado y planes de ejecución anotados. Los objetivos de fila pueden afectar más que la elección del tipo de combinación o si las búsquedas y búsquedas son preferibles a los escaneos. Más detalles sobre eso aquí .
Como siempre, un plan de ejecución seleccionado en función de un objetivo de fila está sujeto a las capacidades de razonamiento del optimizador y a la calidad de la información que se le proporciona. No todos los planes con un objetivo de fila producirán el número requerido de filas más rápido en la práctica, pero de acuerdo con el modelo de costos lo hará.
Cuando un plan de objetivos de fila no sea más rápido, generalmente hay formas de modificar la consulta o proporcionar mejor información al optimizador de modo que el plan seleccionado de forma natural sea el mejor. La opción adecuada en su caso depende de los detalles, por supuesto. La función de objetivo de fila es generalmente muy efectiva (aunque hay un error a tener en cuenta cuando se usa en planes de ejecución paralelos).
Es posible que su consulta y plan en particular no sean adecuados para un análisis detallado aquí (de todos modos, proporcione un plan de ejecución real si lo desea), pero es de esperar que las ideas esbozadas aquí le permitan avanzar.
ORDER BY
cláusula. AgregandoTOP
cambios en el plan donde ocurre este tipo, pero estoy más preocupado por cómo afecta el número de ejecuciones de búsquedas de índice en la tabla B ... (por supuesto, los dos pueden estar relacionados, no lo sé)