日期:2014-05-16  浏览次数:21041 次

求优化历遍表代码.
用游标16分钟.
用以下方法要20多分钟,请高手指点.


/* ycfj_bp_1与ycfj_bp内容相同.共有43259条记录.
*/   
    WHILE EXISTS ( select id from ycfj_bp_1)

    BEGIN  
       set @ia=@ia+1
       
       SELECT top 1  @pbppf=部品品番,@bpsl=部品数量,@jhrq=交货日期,@id=id  FROM    ycfj_bp_1  

       select @pdsl=实盘数量,@idd=id from cp_hbpd where 部品品番=@pbppf
       if @pdsl<0
       begin
          print '小余0第:'+cast(@ia as varchar(10))
          if exists(select id from ycfj_bp where id>@id and 部品品番=@pbppf)
          begin
           delete ycfj_bp where id>@id and 部品品番=@pbppf
          end
       end else begin
          print '大余0第:'+cast(@ia as varchar(10))
          if exists(select id from ycfj_bp where id=@id)
          begin
            --扣除在库
             select @pdsl_1=实盘数量 from cp_hbpd_1 where 部品品番=@pbppf--盘点数量
             select @ylhsl=实盘数量 from cp_ylsl where 部品品番=@pbppf--已来料数量.
             update ycfj_bp set 盘点数量=@pdsl_1,盘点剩余=(@pdsl-@bpsl),在库日期=@jhrq,在库数量=(@pdsl-@bpsl),
                    已来料=@ylhsl  
                    where id=@id
             update cp_hbpd set 实盘数量=实盘数量-@bpsl where id=@idd
          end
       end
       delete from ycfj_bp_1 where [id] = @Id   
    END


------解决方案--------------------
直接关联计算就好了,不需要游标。
------解决方案--------------------
引用:
回楼上,一点都不复杂呀,我就是不明白了,为什么游标比我这循环还快.


这个之前也有人在论坛提问过类似的问题,他原来是用游标来做的,后来觉得太慢,于是我建议用while循环来处理。

之后他把代码改成了循环,发现比游标还慢,说使用循环,更容易导致阻塞问题,也就是慢的原因在于有阻塞