Eu tenho uma consulta como esta:
SELECT col1
FROM MyTable
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Isso fornece uma dica de ferramenta sobre o plano de execução semelhante a esta:
A dateadd
parte dos predicados de busca é executada para cada linha na consulta? Ou o SQL Server calcula o valor uma vez para toda a consulta?
Certas funções que são conhecidas como constantes de tempo de execução passam pelo processo chamado dobramento constante . Ao 'dobrar' uma constante, uma expressão é avaliada no início da execução da consulta, o resultado é armazenado em cache e o resultado em cache é usado quando necessário. A expressão em sua consulta
DATEADD(dd, 0, DATEDIFF(dd, 0, getdate()))
é, AFAIK, uma constante de tempo de execução e, portanto, será dobrada e avaliada apenas uma vez por consulta.Como curiosidade: a
RAND()
função que se esperaria ser desdobrável é na verdade dobrável, o que leva a um comportamento inesperado. Mas outros, por exemploNEWID()
, não são dobráveis e forçarão uma avaliação por linha.Os planos de execução são ótimos, mas às vezes eles simplesmente não dizem a verdade. Então aqui está uma prova baseada no teste de desempenho.
(e a linha inferior - a expressão não está sendo avaliada para cada linha)
Esta é a consulta OP e leva cerca de 12 segundos para ser executada
Esta consulta que armazena a data em um parâmetro antes da execução, leva aproximadamente o mesmo tempo, 12 segundos.
E apenas para verificar os resultados -
Esta consulta que faz o cálculo em col1 e, portanto, precisa recalcular a expressão para cada linha leva cerca de 30 segundos para ser executada.
Todas as consultas foram executadas repetidamente mostrando as mesmas métricas