Хранимая процедура, вызывающая 100% загрузку процессора - PullRequest
0 голосов
/ 23 января 2020

У меня есть хранимая процедура в большой базе данных. Это занимает 15 минут и вызывает 100% загрузку процессора. Я думаю, что причиной этого является использование курсора. Как я могу улучшить производительность курсора, или любая альтернатива l oop даст мне лучшую производительность?

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...