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)
;with t(i) as (select 0 union all select i+1 from t where i < 9)
select getdate()-1 as col1,getdate() as col2,getdate() as col3
into #t
from t t0,t t1,t t2,t t3,t t4,t t5,t t6,t t7
(100000000 linhas afetadas)
Essa é a consulta OP e leva cerca de 12 segundos para ser executada
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
Essa consulta que armazena a data em um parâmetro antes da execução, leva aproximadamente o mesmo tempo, 12 segundos.
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
E apenas para verificar os resultados -
Essa consulta que calcula a col1 e, portanto, precisa recalcular a expressão para cada linha leva cerca de 30 segundos para ser executada.
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
Todas as consultas foram executadas mostrando repetidamente as mesmas métricas
GETDATE()
.