2015-12-31 6 views
1

Следующие хранимые процедуры работают 4 часа. В любом случае я могу оптимизировать его, чтобы сократить время выполнения до 10 минут?Sybase хранимая процедура занимает слишком много времени

Таблица #TbTemp имеет 150 тыс. Строк. И курсор зацикливается 150k раз.

Поскольку я имею дело с таблицами Temp, у меня будет полный контроль над созданием любых индексов -etc.

Так как курсоров следует избегать, любое альтернативное решение?

declare tmpCur cursor 
for 
select LnNo,instDrftCreatnDt 
from #TbTemp 
for read only 

open tmpCur 

while (1 = 1) 
begin --{ 
    fetch tmpCur into @LnNo,@Dt 

    insert into #TmpLnPmt 
      (RecTyp,InstNo,LnNo,TotCurChrgdFactr,PmtTyp, 
      CurrChrgdFactr,CurrPmtAmt,PrevCmptdPmtAmt,NetCmptdPmtAmt) 
    select '01', @InstNo, @LnNo, @TotCurChrgdFactr, pc.PmtTyp, 
      0, 0, pc.cmptdPmtAmt, 0-pc.cmptdPmtAmt 
    from Ln l, Pmt pt, PmtCmpnt pc 
    where l.LnNo = @LnNo 
    and  pt.mbsLoanPID = l.identifier 
    and  pt.instDrftCreatnDt = @Dt 
    and  pc.paymentComponentsPaymentPID = pt.identifier 
    and  pc.PmtTyp not in (select PmtTyp 
        from #TbTemp 
        where LnNo = @LnNo) 
    and  not exists (select 1 from #TmpLnPmt 
       where LnNo = @LnNo 
       and  PmtTyp = pc.PmtTyp) 
    end --} 
close tmpCur 
deallocate cursor tmpCur        
+0

Просто чтобы прояснить, это не только курсоры, которые следует избегать, но любой перекручивание или строку с помощью итераций строки. RDBMS основана на концепции наборов и оптимизирована для работы с наборами, а не с строками. –

ответ

0

Вот один способ без использования CURSOR

INSERT INTO #tmplnpmt 
      (rectyp, 
      instno, 
      lnno, 
      totcurchrgdfactr, 
      pmttyp, 
      currchrgdfactr, 
      currpmtamt, 
      prevcmptdpmtamt, 
      netcmptdpmtamt) 
SELECT '01', 
     @InstNo, 
     a.lnno, 
     @TotCurChrgdFactr, 
     pc.pmttyp, 
     0, 
     0, 
     pc.cmptdpmtamt, 
     0 - pc.cmptdpmtamt 
FROM ln l 
     INNER JOIN pmt pt 
       ON pt.mbsloanpid = l.identifier 
     INNER JOIN pmtcmpnt pc 
       ON pc.paymentcomponentspaymentpid = pt.identifier 
     INNER JOIN #tbtemp a 
       ON l.lnno = a.lnno 
        AND pt.instdrftcreatndt = a.instdrftcreatndt 
WHERE NOT EXISTS (SELECT pmttyp 
        FROM #tbtemp t 
        WHERE t.pmttyp = pc.pmttyp) 
     AND NOT EXISTS (SELECT 1 
         FROM #tmplnpmt a 
           INNER JOIN #tbtemp b 
             ON a.lnno = b.lnno 
             AND pmttyp = pc.pmttyp) 
+0

К сожалению, при копировании была опечатка. #instpmtcmpnt также должен быть #tbtemp в исходном вопросе. Повторите попытку? Я ценю вашу помощь!! – user3058642

+0

@ user3058642 - проверьте последний код –

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