游标处理速度非常
游标处理速度非常,可是我通过声明游标需要循环的数据才三条,在线上跑这段sql用了一分多钟。
我处理过好几千条数据也没问题,但是就是这个三条数据的总是超时。
--打开游标
open GkMpExchange_cursor
--循环数据
fetch next from GkMpExchange_cursor into @MPCutScoreDetailId,@reguser,@mprule,@CutScore,@createon
print @TotalCutScore
WHILE (@@FETCH_STATUS=0 and @TotalCutScore>0)
begin
--begin tran
select @Id=right(newid(),19)
if @CutScore<=@TotalCutScore
begin
set @TotalCutScore=@TotalCutScore-@CutScore
--update MPRuleHistory set CutScore=0 where id=@MPCutScoreDetailId
insert into #SubMpScoreTable(MPCutScoreDetailId,CutScore,MpRule,reguser,IsMp,IsExchange,createon,CreateTime) values(@MPCutScoreDetailId,@CutScore,@MpRule,@userid,@IsMp,@isexchange,@createon,getdate())
end
else
begin
--set @CutScore=@CutScore-@TotalCutScore
--update MPRuleHistory set CutScore=@CutScore where id=@MPCutScoreDetailId
insert into #SubMpScoreTable(MPCutScoreDetailId,CutScore,MpRule,reguser,IsMp,IsExchange,createon,CreateTime) values(@MPCutScoreDetailId,@TotalCutScore,@MpRule,@userid,@IsMp,@isexchange,@createon,getdate())
set @TotalCutScore=0
BREAK
end
fetch next from GkMpExchange_cursor into @MPCutScoreDetailId,@reguser,@mprule,@CutScore,@createon
end
--关闭,释放游标资源
close GkMpExchange_cursor
DEALLOCATE GkMpExchange_cursor
select reg.loginname,mpj.GkDepartmentName,mpj.MpProjectName,r.name, mpd.CutScore,r.comment,mpd.createon,mpd.createtime from #SubMpScoreTable as mpd left join mprule as r on r.id=mpd.mprule left join MPProject as mpj on mpj.id=r.MpProjectId left join reguser as reg on reg.id=mpd.reguser where r.status='VLD' and mpj.status='VLD' order by mpd.createon asc
drop table #SubMpScoreTable
END