存储过程导致100%CPU使用率

时间:2020-01-23 19:56:08

标签: sql-server tsql

我在大型数据库中有一个存储过程。这需要15分钟,并导致100%CPU使用率。我认为这样做的原因是使用游标。如何提高游标性能,或者任何替代循环都能使我获得更好的性能?

 NextStore:
 Set @oldrn = 0  Set @OldCost = 0 Set @totalqty = 0 Set @OldDetailid = 0 set @MCOUNTER = 0Set @itemType = 0  Set @TotQty4Equation = 0 

Declare CUR_AdjustAVGWithoutBalance  cursor   local static read_only forward_only 
          For

        SELECT  MQTY,TotalQTY,
                Price ,
                Code ,
                Entry_Date,
                ID  ,Transaction_move,FinishedReceipt_dID,Parent_ID , Final_conv
        From #AVG_WithoutBalanceTB 
        order by Entry_Date

     SET @MCOUNTER = 0
     OPEN CUR_AdjustAVGWithoutBalance 
    Fetch Next From CUR_AdjustAVGWithoutBalance Into @Mqty, @totalqty,@MPRICE, @Transaction_Code,@Entry_Date,@detailID ,@Transaction_move,@FinishedProductID,@parentID,@Finalconv
    While @@Fetch_Status = 0 Begin 

        Set @TotQty4Equation = @totalqty - @MQTY 
        IF @totalqty > 0 
            SET @LD_COSTPRICE= ((@MQTY*@MPRICE)+((@TotQty4Equation )*@oldcost) )/@totalqty       
        ELSE
        Begin
            IF @totalqty = 0 Set @LD_COSTPRICE = @MPRICE
            ELSE  
            SET @LD_COSTPRICE=@oldcost 
        END

        IF @LD_COSTPRICE IS NULL or @LD_COSTPRICE < 0  SET @LD_COSTPRICE = 0 
        Set @oldcost = @LD_COSTPRICE 
        update       Inv_Receipt_d set  AvgCost = @oldcost   where id = @Detailid



        NextLoop:    


    Fetch Next From CUR_AdjustAVGWithoutBalance Into @Mqty,@totalqty,@MPRICE, @Transaction_Code,@Entry_Date,@detailID ,@Transaction_move,@FinishedProductID,@parentID,@Finalconv

    End     

    Close CUR_AdjustAVGWithoutBalance
    Deallocate CUR_AdjustAVGWithoutBalance
    Drop table #AVG_WithoutBalanceTB ;   

    While @readrownum <= @insertrownum
    Begin

        Select @STORE_id = transStore ,@AT_DATE =  transdate ,@detailID = TransDetailID  from @TransferTrans where rownum = @readrownum ;
        Set @readrownum = @readrownum + 1
        GoTo NextStore
    END

0 个答案:

没有答案