日期差计算的性能问题

13

我有一个天数变量,我想将其与日期时间列(发送时间)进行比较。

目前我正在这样做:

DECLARE @RunDate datetime = '2013-01-01' 
DECLARE @CalculationInterval int = 10

DELETE
FROM TableA
WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

任何超过10天的东西都应该被删除。我们在sendDate列上有索引,但速度仍然慢得多。我知道左侧不应该进行计算以提高性能,但除此之外,有什么最优解决这个问题的方法?


在这种情况下,我该如何使查询“SARGable”? - Murtaza Mandvi
相关问题:https://dev59.com/LHRA5IYBdhLWcg3w2x6W#799616 - skolima
1个回答

20

这个表达式

WHERE datediff(dd, senddate, @RunDate) > @CalculationInterval 

由于senddate列上的函数,将无法在该列上使用索引。为使WHERE子句'SARGable'(即可使用索引),请更改为等效条件:

WHERE senddate < dateadd(dd, -@CalculationInterval, @RunDate)

[感谢 @Krystian Lieber 指出条件不正确].


1
我认为条件应该是 WHERE senddate < dateadd(dd, -@CalculationInterval, @RunDate) 并且条件应该是 WHERE senddate > dateadd(dd, @CalculationInterval, @RunDate) 对于 @RunDate= '2013-01-11' 和 @CalculationInterval= 10,当我们想要删除所有 senddate > '2013-01-21' 的行时,我认为我们应该删除所有 senddate < '2013-01-01' 的行。 - Krystian Lieber
@Krystian Lieber - 没错,我已经在我的端口进行了更改,只是想知道如何使它可搜索 :) - Murtaza Mandvi
@Mitch Wheat,您能根据上述建议更正那个答案吗?我会将其标记为已接受的。 - Murtaza Mandvi
我不知道 '-@var' = '-1*var' 这个公式。 我从这个答案中学到了两件事,谢谢! - FabianSilva

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接