Answers:
执行计划很棒,但有时它们只是不告诉你真相。因此,这是基于性能测试的证明。
(最重要的是-表达式未针对每一行进行求值)
;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行)
这是OP查询,大约需要12秒钟才能运行
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
BETWEEN col2
AND col3
;
此查询在执行之前将日期存储在参数中,大约需要12秒钟的时间。
declare @dt datetime = DATEADD(dd, 0, DATEDIFF(dd, 0, GETDATE()))
SELECT col1
FROM #t
WHERE
@dt
BETWEEN col2
AND col3
;
只是为了验证结果-
此查询对col1进行计算,因此必须重新计算每一行的表达式,大约需要30秒钟才能运行。
SELECT col1
FROM #t
WHERE
DATEADD(dd, 0, DATEDIFF(dd, 0, col1))
BETWEEN col2
AND col3
;
重复执行所有查询,显示大约相同的指标
GETDATE()
。