У меня есть хранимая процедура в большой базе данных. Это занимает 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