2014-09-15 2 views
0

Я использую следующий код на основе кода в sql для расчета счета клиентов, но он занимает 3 минуты, чтобы выполнить операцию на 40000 записей !!! дайте мне знать, в чем проблема ???Низкая производительность на основе хранимой процедуры

with cte (ID,[Date],Time,DocumentNumber,Title,TopicFK,Description,DocumentHeaderID,Debit,Credit,Balance,[Status]) 
as 
(
    select ID,[Date],Time,DocumentNumber,Title,TopicFK,Description,DocumentHeaderID,Debit, Credit, Balance=(case when (Debit>Credit) then abs(Debit) else abs(Credit) end), [Status]=cast((case when (Debit>Credit) then 'Debit' else 'Credit' end)as nvarchar(10)) 
     from #t1 
     where ID = 1 
    union all 
    select tbl.ID,tbl.[Date],tbl.Time,tbl.DocumentNumber,tbl.Title,tbl.TopicFK,tbl.Description,tbl.DocumentHeaderID,tbl.Debit, tbl.Credit 
      , Balance=cast((case when ((tbl.Debit > 0 and cte.[Status] = 'Debit')) then abs(cte.Balance + tbl.Debit) 
       when tbl.Debit > 0 and cte.[Status] = 'Credit' then abs(cte.Balance - tbl.Debit) 
       when(tbl.Credit > 0 and cte.[Status] = 'Debit') then abs(cte.Balance - tbl.Credit) 
       when(tbl.Credit > 0 and cte.[Status] = 'Credit') then abs(cte.Balance + tbl.Credit) 
           end)as decimal(18,0)) 
      , cast((case when ((tbl.Debit > 0 and cte.[Status] = 'Debit')) then 'Debit' 
       when tbl.Debit > 0 and cte.[Status] = 'Credit' then 'Credit' 
       when(tbl.Credit > 0 and cte.[Status] = 'Debit') then 'Debit' 
       when(tbl.Credit > 0 and cte.[Status] = 'Credit') then 'Credit' 

       end)as nvarchar(10)) as [Status] 
     from #t1 tbl 
      inner join cte cte 
      on tbl.ID = cte.ID + 1 

) 

select [Date],Time,DocumentNumber,Title,TopicFK,Description,DocumentHeaderID, Debit, Credit, Balance, [Status] from cte 
option (maxrecursion 0); 

ответ

0

Поле [Статус] не имеет индекса, поскольку оно создано в предложении WITH. Я рекомендую вам не использовать поле [Статус] в вашем предложении WHERE

cast((case when ((tbl.Debit > 0 and cte.Debit>cte.Credit)) then abs(cte.Balance + tbl.Debit) 
       when tbl.Debit > 0 and cte.Debit<=cte.Credit then abs(cte.Balance - tbl.Debit) 
       when(tbl.Credit > 0 and cte.Debit>cte.Credit) then abs(cte.Balance - tbl.Credit) 
       when(tbl.Credit > 0 and cte.Debit<=cte.Credit) then abs(cte.Balance + tbl.Credit) 
           end)as decimal(18,0)) 
+0

Вы имеете в виду удалить строку 4,5,6,7 ??? поэтому дайте мне знать, как установить поле статуса в строке 14? –

+0

Что, черт возьми, линия 14? или 4,5,6,7? Я имею в виду, что, несмотря на использование [Status], вы должны использовать поля «Дебет и кредит». Во втором CASE - вы можете хранить эти данные из предыдущего документа - несмотря на подсчет и сохранение поля STATUS. – MikkaRin

+0

Я попробовал ваше решение, но не повлиял на производительность! –