Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Sybase存储过程占用的时间太长_Sql_Stored Procedures_Cursor_Sybase_Sql Optimization - Fatal编程技术网

Sql Sybase存储过程占用的时间太长

Sql Sybase存储过程占用的时间太长,sql,stored-procedures,cursor,sybase,sql-optimization,Sql,Stored Procedures,Cursor,Sybase,Sql Optimization,以下存储过程正在运行4小时。我是否可以优化它以将执行时间降低到10分钟以下 表#TbTemp有150k行。光标循环15万次 因为我处理的是临时表,所以我可以完全控制创建任何索引——等等 既然应该避免使用游标,还有其他解决方案吗 declare tmpCur cursor for select LnNo,instDrftCreatnDt from #TbTemp for read only open tmpCur while (1 = 1) begin --{ fetch tm

以下存储过程正在运行4小时。我是否可以优化它以将执行时间降低到10分钟以下

表#TbTemp有150k行。光标循环15万次

因为我处理的是临时表,所以我可以完全控制创建任何索引——等等

既然应该避免使用游标,还有其他解决方案吗

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                            

这里有一种不使用
光标的方法

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) 

这里有一种不使用
光标的方法

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) 

抱歉,复制时出现了一个输入错误#仪器也应为原始问题中的“tbtemp”。你能再查一下吗?我感谢你的帮助!!抱歉,复制时出现了一个输入错误#仪器也应为原始问题中的“tbtemp”。你能再查一下吗?我感谢你的帮助!!澄清一下,应该避免的不仅仅是游标,还有任何循环或逐行迭代。RDBMS基于集合的概念,并针对集合而不是行进行优化。澄清一下,应该避免的不仅仅是游标,而是任何循环或逐行迭代。RDBMS基于集合的概念,并经过优化以处理集合而不是行。