我有一个查询返回数千个记录,并跨几个表连接。在WHERE子句中,过去检查日期不超过两个月。起初,查询将此日期边界设置为变量,WHERE使用该边界。请确认:SYSDATETIME()比WHERE子句中的GETDATE()慢
DECLARE @startdate as DATE = DATEADD(MONTH, -2, SYSDATETIME())
select [....]
where dateinquestion >= @startdate
这将运行得很好(返回4秒预期的结果),但我想摆脱变量声明和分配移动到WHERE子句本身:
select [....]
where dateinquestion >= DATEADD(MONTH, -2, SYSDATETIME())
这运行一分钟以上并吃掉所有的CPU。我杀了查询停止推送服务器,没有给出结果。更改为GETDATE()(我不需要从SYSDATETIME(精度)反正)加快东西:
select [....]
where dateinquestion >= DATEADD(MONTH, -2, GETDATE())
测试结果类似于方案1.
我相信这是因为SYSDATETIME评价上因为处理一行需要几个纳秒,这对SYSDATETIME很重要。但GETDATE具有更高的更改阈值,不受影响(或受影响较小),并且不会更改 - 或需要重新评估 - 以每行为基础。
您能确认吗?我对这种行为的假设是否正确?
我搜索了这一点,但无法找到除了这个,什么都仅关注分配SYSDATETIME()给一个变量,在哪里都不使用它:仅 Does SYSDATETIME() cost more than GETDATE()?
而且这一点,但GETDATE在此示例中使用: TSQL datetimes functions in where clause
该转换不是缓慢的唯一原因。由于转换,数据库不能再使用'datetime'字段的索引,而需要执行缓慢的表扫描。 – 2015-11-11 12:27:09