Eu tenho o mesmo cálculo nas cláusulas SELECT e GROUP BY. O servidor SQL está realmente realizando esses cálculos duas vezes ou é inteligente o suficiente para fazer apenas uma vez?
A resposta simples é que o SQL Server não oferece garantias gerais sobre quando e quantas vezes uma expressão escalar será avaliada no momento da execução.
Existem todos os tipos de comportamentos complicados (e não documentados) no mecanismo de otimização e execução em relação ao posicionamento, execução e armazenamento em cache de expressões escalares. O Books Online não tem muito a dizer sobre isso, mas o que diz é o seguinte:
Isso descreve um dos comportamentos que eu aludi antes, a execução adiada de expressões. Eu escrevi sobre alguns dos outros comportamentos atuais (que podem mudar a qualquer momento) nesta postagem do blog .
Outra consideração é que o modelo de custo usado pelo otimizador de consultas atualmente não faz muito em termos de estimativa de custos para expressões escalares. Sem uma estrutura de custos robusta, os resultados atuais são baseados em heurísticas amplas ou em puro acaso.
Para expressões muito simples, provavelmente não faz muita diferença se a expressão é avaliada uma ou várias vezes na maioria dos casos. Dito isso, encontrei grandes consultas em que o desempenho foi afetado adversamente quando a expressão é avaliada redundantemente várias vezes ou a avaliação ocorre em um único encadeamento no qual seria vantajoso avaliar em um ramo paralelo da execução plano.
Em resumo, o comportamento atual é indefinido e não há muito nos planos de execução para ajudá-lo a descobrir o que aconteceu (e nem sempre será conveniente anexar um depurador para examinar os comportamentos detalhados do mecanismo, como na postagem do blog).
Se você encontrar casos em que problemas de avaliação escalar são importantes para o desempenho, levante o problema com o Suporte da Microsoft. Essa é a melhor maneira de fornecer feedback para melhorar as versões futuras do produto.
cross apply
nesse caso é um pouco exagerada e provavelmente prejudicaria o desempenho ao introduzir uma auto-junção desnecessária.CROSS APPLY
just define o alias das colunas na mesma linha. Não há necessidade de participar. por exemplo,SELECT COUNT(*), hilo FROM master..spt_values CROSS APPLY (VALUES(high + low)) V(hilo) GROUP BY hilo
O desempenho é apenas um aspecto. O outro é a manutenção.
Pessoalmente, costumo fazer o seguinte:
ATUALIZAR:
Se você não gosta de aninhar, pode criar VIEW para cada tabela em que precisa usar expressões complexas.
Então você pode selecionar sem fazer aninhamento extra;
fonte