【发布时间】:2015-06-05 21:35:38
【问题描述】:
我有一个查询,它返回几千条记录,跨多个表连接。在 WHERE 子句中,日期被检查为不超过过去两个月。起初,查询将此日期边界设置为变量,并且 WHERE 使用了它。
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() 分配给一个变量,而不是在 WHERE 中使用它: Does SYSDATETIME() cost more than GETDATE()?
也是这样,但在示例中只使用了 GETDATE: TSQL datetimes functions in where clause
【问题讨论】:
标签: sql-server datetime sql-server-2012