我的查询运行有点慢,我认为这是因为该where datediff
功能。
WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
(使用这种方法至少是使用我创建的索引)
在此之前是这样的:
datediff(minute, TB1.stDate), '2017-01-01') <= 0)
我想了解是否有更好的方法来过滤 datediff。
我的问题是,我的查询是如何使用索引的,即使在DATEDIFF
函数内部也是如此。
我的查询运行有点慢,我认为这是因为该where datediff
功能。
WHERE DateDiff(minute, TB1.stDate, getdate()) > 50
(使用这种方法至少是使用我创建的索引)
在此之前是这样的:
datediff(minute, TB1.stDate), '2017-01-01') <= 0)
我想了解是否有更好的方法来过滤 datediff。
我的问题是,我的查询是如何使用索引的,即使在DATEDIFF
函数内部也是如此。
永远不要将函数应用于列,这意味着没有索引可以用于查找并且使得基数估计非常困难。说“使用索引”并不能很好地说明这样做是否值得或是否值得。
首先,为了避免将函数应用于列...
...可以改写为...
您的原始查询说“查找表中日期与现在之间的差异大于 50 分钟的任何行”,这意味着“查找表中日期早于 50 分钟前的任何行”。所以,我从现在减去 50 分钟,并查询比这更早的日期值。另一个更详细的答案在这里。
我怀疑您的索引正在被扫描,因为它涵盖了查询(如果您包含索引定义、查询的其余部分和执行计划,您可能会比猜测更好)。
我想知道如果那样的话会不会更快
子句是预先计算的 SQL 变量?
从那以后,我受到 Erik Darling 和 Aaron Bertrand 的教育,使用变量通常比使用表达式更糟糕!感谢他们俩!我会在此处留下此回复,以防将来对其他人有帮助。一定要阅读他们的回复!