DATEADD函数的性能问题

时间:2015-05-11 13:11:28

标签: sql-server performance sql-server-2008 dateadd

这是我的实际选择查询,

SELECT b.CaseNumber as CaseNumber,b.DebtorNr ,b.ActionDate,DATEADD(MONTH,-12,b.ActionDate) one_month,a.Registerdate --COALESCE(count(A.historynr),0) as DebtorActivity  
                from rr..r_basic_info b 
                join rr..activities_VW as A on b.DebtorNr=a.Debtornr
                where 
                    B.Debtornr = A.Debtornr 
                    --and a.Registerdate<=b.ActionDate --this condition works
                    and a.registerdate >= DATEADD(month,-12,getdate()) --i have a problem with this condition and causing huge time consumption

我在这里定义的视图是activities_VW

select H.NR as historynr,o.debtornr as Debtornr, O.NR as ordernr, h.Actmenunr as Actmenunr,h.AGREEMENT as AgreementCode, h.Registerdate as Registerdate

来自abc..history h加入abc..orders o on o.NR = h.ORDERNR

我的执行计划就像 enter image description here

所有行的另外一个信息b.actionDate列的值与“2015-04-11 08:37:44.037”相同。
我已经检查了所有日期格式,但没有发现任何错误 对于另一种情况,我对b.actionDate列中的不同行有不同的值,并且它适用于该情况。

谢谢

2 个答案:

答案 0 :(得分:0)

我的理解可能是错的,所以只能作为一种可能性 - 当在连接条件和/或where子句中使用函数时,为了确定数据是否符合条件,必须对照每一行检查桌子。

考虑您的第一部分WHERE e.DATE <= a.joining_date - 您可以直接查看小于e.DATE的行。

对于您的第二部分AND e.DATE >= DATEADD(MONTH, - 6, a.joining_date) - 没有列是&#34;加入日期减去6个月&#34;,因此要确定e.Date是否大于它,您需要对表中的a.joining_date的每个实例执行该计算。

请记住where子句信息未被评估的顺序是在查询中写下来的 - 所以你认为被where的第一部分消除的行是不一定被它消除。因此,正如其中一条评论建议的那样,使用DATEADD(MONTH, - 6, a.joining_date)上的计算/持久列可能效果很好。

答案 1 :(得分:0)

这是我的实际选择查询,

SELECT b.CaseNumber as CaseNumber,b.DebtorNr ,b.ActionDate,DATEADD(MONTH,-12,b.ActionDate) one_month,a.Registerdate --COALESCE(count(A.historynr),0) as DebtorActivity  
                from rr..r_basic_info b 
                join rr..activities_VW as A on b.DebtorNr=a.Debtornr
                where 
                    B.Debtornr = A.Debtornr 
                    --and a.Registerdate<=b.ActionDate --this condition works
                    and a.registerdate >= DATEADD(month,-12,getdate()) --i have a problem with this condition and causing huge time consumption

我在这里定义的视图是activities_VW

select H.NR as historynr,o.debtornr as Debtornr, O.NR as ordernr, h.Actmenunr as Actmenunr,h.AGREEMENT as AgreementCode, h.Registerdate as Registerdate

来自abc..history h加入abc..orders o on o.NR = h.ORDERNR

我的执行计划就像 enter image description here

所有行的另外一个信息b.actionDate列的值与“2015-04-11 08:37:44.037”相同。
我已经检查了所有日期格式,但没有发现任何错误 对于另一种情况,我对b.actionDate列中的不同行有不同的值,并且它适用于该情况。

谢谢