Sql Sybase存储过程占用的时间太长
以下存储过程正在运行4小时。我是否可以优化它以将执行时间降低到10分钟以下 表#TbTemp有150k行。光标循环15万次 因为我处理的是临时表,所以我可以完全控制创建任何索引——等等 既然应该避免使用游标,还有其他解决方案吗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
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基于集合的概念,并经过优化以处理集合而不是行。