¿Qué reglas determinan cuando SQL Server utiliza un CTE como una "valla de optimización"?

10

Hace un tiempo, Brent Ozar publicó una publicación que detalla algunas de las diferencias entre SQL Server y PostgreSQL:

Dos diferencias importantes entre SQL Server y PostgreSQL

El primer punto ("CTE son vallas de optimización") me llamó la atención, porque es obvio que en el ejemplo proporcionado, SQL Server combina el CTE y la consulta principal y lo optimiza como una consulta única (a diferencia del comportamiento opuesto en PostgreSQL).

Sin embargo, este comportamiento parece contrario a los ejemplos que he visto en otros blogs y clases de capacitación, donde SQL Server trata el CTE como una valla de optimización, que permite un mejor uso de los índices, un mejor rendimiento, etc. Por ejemplo:

Una mejor manera de seleccionar estrella

Por lo tanto, parece que SQL Server "honra" al CTE como un cerco de optimización A VECES. ¿Hay algún buen recurso disponible que documente la lista específica de casos conocidos en los que SQL Server honrará de manera confiable al CTE como una valla de optimización (o el comportamiento opuesto)?

Bryan Rebok
fuente

Respuestas:

10

... lista de casos conocidos en los que SQL Server honrará de manera confiable el CTE como una valla de optimización

Cualquier lista de este tipo dependería del comportamiento observado, sin garantía de fiabilidad.

El optimizador de consultas de SQL Server nunca trata una expresión de tabla común como un cerco de optimización per se , aunque algunas construcciones son claramente difíciles de optimizar. Los CTE recursivos son un buen ejemplo de esto.

Los CTE se tratan de manera muy similar a las vistas / funciones en línea / subconsultas / tablas derivadas y se incorporan a la consulta. Cualquier comportamiento de 'cerca' observado depende de que el optimizador no sea capaz o no decida optimizar a través de ese borde permeable en principio.

En términos generales, cuanto más simple y más "relacional" sea el CTE, más probable es que el optimizador pueda mover bits.

Se han sugerido, pero aún no se han implementado, características que le permitirían considerar al optimizador o forzarlo a materializar el "resultado" de un CTE

Mientras tanto, la solución más común es materializar explícitamente el conjunto de resultados intermedios en una tabla temporal o variable de tabla. Obviamente, esto requiere un escenario no limitado a una sola declaración.

Paul White 9
fuente