簡體   English   中英

Sybase存儲過程花費太長時間

[英]Sybase stored procedure taking too long

以下存儲的proc運行4小時。 無論如何,我可以對其進行優化以將執行時間減少到10分鍾以下嗎?

表#TbTemp具有15萬行。 光標循環了15萬次。

由於我正在處理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                            

這是不使用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) 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM