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 分钟,并查询早于该时间的日期值。另一个更详细的答案在这里。
我怀疑您的索引正在被扫描,因为它涵盖了查询(如果您包含索引定义、查询的其余部分和执行计划,您可以获得比猜测更好的结果)。
| 归档时间: |
|
| 查看次数: |
534 次 |
| 最近记录: |