Tengo el mismo cálculo en las cláusulas SELECT y GROUP BY. ¿Realmente el servidor SQL realiza estos cálculos dos veces o es lo suficientemente inteligente como para hacerlo solo una vez?
La respuesta simple es que SQL Server no ofrece garantías generales sobre cuándo y cuántas veces se evaluará una expresión escalar en el momento de la ejecución.
Hay todo tipo de comportamientos complicados (e indocumentados) dentro del motor de optimización y ejecución con respecto a la colocación, ejecución y almacenamiento en caché de expresiones escalares. Books Online no tiene mucho que decir sobre esto, pero lo que sí dice es esto:
Esto describe uno de los comportamientos a los que aludí antes, la ejecución diferida de expresiones. Escribí sobre algunos de los otros comportamientos actuales (que podrían cambiar en cualquier momento) en esta publicación de blog .
Otra consideración es que el modelo de costo utilizado por el optimizador de consultas actualmente no hace mucho en cuanto a la estimación de costos para expresiones escalares. Sin un marco sólido de costos, los resultados actuales se basan en heurísticas amplias o pura casualidad.
Para expresiones muy simples, probablemente no haga mucha diferencia si la expresión se evalúa una o varias veces en la mayoría de los casos. Dicho esto, he encontrado grandes consultas en las que el rendimiento se ha visto afectado negativamente cuando la expresión se evalúa de forma redundante una gran cantidad de veces, o la evaluación se produce en un solo hilo donde hubiera sido ventajoso evaluar en una rama paralela de la ejecución plan.
En resumen, el comportamiento actual no está definido, y no hay mucho en los planes de ejecución para ayudarlo a descubrir qué sucedió (y no siempre será conveniente adjuntar un depurador para examinar los comportamientos detallados del motor, como en la publicación del blog).
Si encuentra casos en los que los problemas de evaluación escalar son importantes para el rendimiento, plantee el problema con el Soporte técnico de Microsoft. Esta es la mejor manera de proporcionar comentarios para mejorar futuras versiones del producto.
cross apply
en este caso es un poco exagerado, y muy probablemente dañaría el rendimiento al introducir una autounión innecesaria.CROSS APPLY
simplemente define el alias de columnas en la misma fila. No es necesario unirse. por ejemploSELECT COUNT(*), hilo FROM master..spt_values CROSS APPLY (VALUES(high + low)) V(hilo) GROUP BY hilo
El rendimiento es solo un aspecto. El otro es la mantenibilidad.
Personalmente, tiendo a hacer lo siguiente:
ACTUALIZAR:
Si no le gusta anidar, puede crear VIEW para cada tabla donde necesite usar expresiones complejas.
Entonces podría seleccionar sin hacer un anidamiento adicional;
fuente