У меня есть две версии одного и того же запроса, которые я пытаюсь выполнить на SQL Server 2008
.SQL-запрос занимает очень много времени для выполнения
Версия 1:
select
count(a.ordernumber) as Orders,
sum(b.agentfees) as AgentFees,
sum(a.revenue) as Revenue,
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date) as Date
from
orders a
join
[DC-SQL-V2].FaxFile.dbo.[agent fees] b on a.ordernumber = b.fforder
where
a.closeoutdate >= '2014-01-01'
and b.dtcreated >= '2014-01-01'
and a.closeoutdate < '2015-01-01'
and b.dtcreated < '2015-01-01'
and a.processserving = 1
and a.branchno = '116'
group by
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date)
order by
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date)
Версия 1 занимает около 3 часов, чтобы закончить, который, очевидно, безумен. Поэтому я создал версию 2, в которой я попытался отфильтровать таблицы перед их присоединением, но это все еще занимает довольно много времени (2 часа и все еще продолжается).
Версия 2:
select
count(a.ordernumber) as Orders,
sum(b.agentfees) as AgentFees,
sum(a.revenue) as Revenue,
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date) as Date
from
(select
ordernumber, revenue, closeoutdate, processserving, branchno
from
ORDERS
where
closeoutdate >= '2014-01-01'
and closeoutdate < '2015-01-01'
and branchno = '116'
and processserving = 1) a
join
(select
agentfees, fforder, dtcreated
from
[DC-SQL-V2].FaxFile.dbo.[agent fees]
where
dtcreated >= '2014-01-01'
and dtcreated < '2015-01-01') b on a.ordernumber = b.fforder
group by
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date)
order by
CAST('1/' + CAST(DATEPART(Month, a.closeoutdate) as varchar) + '/' + CAST(DATEPART(Year, a.closeoutdate) as varchar) as Date)
Вот некоторые дополнительные детали:
select count(*) from [DC-SQL-V2].FaxFile.dbo.[agent fees]
779531
select count(*) from ORDERS
3466648
Вот кластерные столбцы для обеих таблиц (среди других, которые я не выбирая):
ЗАКАЗЫ:
BranchNo
Closeoutdate
ProcessServing
АГЕНТ ТАРИФЫ:
Ничего я выбирающий не кластерные
ли кто-то пожалуйста, быть в состоянии предложить как я могу улучшить производительность моих запросов?
Какие индексы у вас есть на этих таблицах? –
Я бы рекомендовал просмотреть план выполнения, а также проверить, проиндексированы ли объединенные столбцы. – ManojVenkat
Вы никогда не будете рассчитывать заказы, где dtcreated и closeoutdate в разные годы. – JBrooks