2015-12-31 60 views
1

以下存储过程运行4小时。无论如何,我可以优化它以降低执行时间在10分钟以下吗?Sybase存储过程耗时过长

表#TbTemp有150k行。游标循环150k次。

因为我正在处理临时表,所以我将完全控制创建任何索引-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 - 检查最新的代码 –