2015-05-11 3 views
0

Это мой фактический запрос на выборку,проблема производительности с функцией 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 ч присоединиться к abc..orders о на o.NR = h.ORDERNR

и мой план выполнения, как enter image description here

Еще одна информация для всех столбцов столбца b.actionDate имеет такое же значение, как «2015-04-11 08: 37: 44.037».
Я проверил со всеми форматами даты, но ничего плохого не нашел.
Для другого случая у меня другое значение для разных строк в столбце b.actionDate, и оно отлично работает для этого случая.

Благодаря

+3

Можете ли вы показать план выполнения, который генерируется? – Paddy

+1

Это будет общий запрос именно в этой форме?Если это так, вы можете захотеть добавить (и индексировать) [Вычисленный столбец] (https://msdn.microsoft.com/en-us/library/ms188300.aspx), который является 'DATEADD (MONTH, - 6, a .joining_date) ' –

+0

у вас есть functin над a.joiningdate, поэтому он, вероятно, сканирует таблицу присваивания в цикле – dean

ответ

0

Может быть, я неправильно в моем понимании так считать только как возможность - при использовании функции в объединение критериев и/или где положение для того, чтобы определить, являются ли данные удовлетворяют критериям, он должен проверяться на каждую строку таблицы.

Подумайте о своей первой части WHERE e.DATE <= a.joining_date - вы можете просто посмотреть прямо на строки, которые меньше, чем e.DATE.

Для вашей второй части AND e.DATE >= DATEADD(MONTH, - 6, a.joining_date) - нет колонка является «присоединение даты минус 6 месяцев», так, чтобы определить, если e.Date больше, чем это, вам нужно будет выполнить этот расчет на каждом экземпляре a.joining_date в таблице.

Помните, что если информация оговорки не обязательно оценивается в порядке будет это записано в запросе - так строки вы думаете, устраняются первой частью вашего where не обязательно устранить его. Так как один из предложенных комментариев, использование вычисленного/сохраненного столбца на DATEADD(MONTH, - 6, a.joining_date), вероятно, будет работать хорошо.

+0

Фактически DATEADD (MONTH, - 6, a.joining_date) отлично работает, если столбец a.joining_date содержит разные значения, но когда он содержит значения, которые содержат одинаковое значение для всех строк, stuck – Mofizur

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 ч присоединиться к abc..orders о на o.NR = h.ORDERNR

и мой план выполнения, как enter image description here

Еще одна информация для всех строк. Столбец b.actionDate имеет то же значение, что и «2015-04-11 08: 37: 44.037».
Я проверил со всеми форматами даты, но ничего плохого не нашел.
Для другого случая у меня другое значение для разных строк в столбце b.actionDate, и оно отлично работает для этого случая.

Спасибо

+0

У меня около 50000 строк в таблице basic_info – Mofizur

Смежные вопросы