【发布时间】:2018-11-25 22:40:49
【问题描述】:
我有一个存储项目余额的表。
CREATE TABLE itembalance (
ItemID VARCHAR(15),
RemainingQty INT,
Cost Money,
Id INT
)
我需要确保每次发出物品时,都会从 itembalance 表中扣除适当的余额。我是这样做的:
DECLARE crsr CURSOR LOCAL FAST_FORWARD FOR
SELECT
itembalance.Cost,
itembalance.RemainingQty
itembalance.Id
FROM dbo.itembalance
WHERE itembalance.ItemID = @v_item_to_be_updated AND RemainingQty > 0
OPEN crsr
FETCH crsr
INTO
@cost,
@qty,
@id
WHILE @@FETCH_STATUS = 0
BEGIN
IF @qty >= @qty_to_be_deducted
BEGIN
UPDATE itembalance SET RemainingQty = RemainingQty - @qty_to_be_deducted WHERE Id = @id
/*do something with cost*/ BREAK
END
ELSE
BEGIN
UPDATE itembalance SET RemainingQty = 0 WHERE Id = @id
/*do something with cost*/ SET @qty_to_be_deducted = @qty_to_be_deducted - @qty
END
FETCH crsr
INTO
@cost,
@qty,
@id
END
CLOSE crsr
DEALLOCATE crsr
该表可能包含相同的项目代码,但成本不同。此代码适用于一次更新的少量项目,但每当发送大量项目/数量时,该过程变得非常缓慢。有没有办法优化这段代码?我猜光标让它变慢了,所以我想为这个过程探索不同的代码。
【问题讨论】:
-
你怎么称呼那个 T-SQL?从触发器?还是来自客户端应用程序?
-
根据您的代码编写方式,您会看到单个 ItemId 有许多 ItemBalance 记录。但是你怎么知道它们的顺序是什么?您需要多条记录(历史)还是一条记录(当前状态)?
-
以前,它是在触发器上。我现在将其移至另一个应用程序,该应用程序将完成所有后端工作。
-
相同的项目可能有不同的成本。此循环将更新发送记录的成本。
-
您是否偶然简化了您的 SQL?因为您上面的代码正在选择具有剩余数量的选定 ItemId 的所有记录。没有基于成本的选择或更新,并且游标中处理记录的顺序是随机的,这看起来很奇怪。
标签: sql sql-server database query-optimization