调整 WHERE datediff

Rac*_*SQL 0 sql-server sql-server-2016

我的查询运行有点慢,我认为这是因为该where datediff函数。

WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
Run Code Online (Sandbox Code Playgroud)

(通过这种方法至少使用我创建的索引)

之前是这样的:

datediff(minute, TB1.stDate), '2017-01-01') <= 0)
Run Code Online (Sandbox Code Playgroud)

我想了解是否有更好的方法使用 datediff 进行过滤。

我的问题是,即使在函数内部,我的查询如何已经使用索引DATEDIFF

Aar*_*and 10

切勿将函数应用于列,这意味着没有索引可用于查找,并使基数估计变得非常困难。说“使用索引”并不能很好地说明如何或是否值得这样做。

首先,避免将函数应用于列......

WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
Run Code Online (Sandbox Code Playgroud)

...可以重写为...

WHERE TB1.stDate < DATEADD(MINUTE, -50, GETDATE());
Run Code Online (Sandbox Code Playgroud)

您的原始查询表示“查找表中日期与现在日期之间的差异大于 50 分钟的任何行”,这意味着“查找表中日期早于 50 分钟前的任何行”。因此,我从现在开始减去 50 分钟,并查询早于该时间的日期值。另一个更详细的答案在这里

我怀疑您的索引正在被扫描,因为它涵盖了查询(如果您包含索引定义、查询的其余部分和执行计划,您可以获得比猜测更好的结果)。