update里嵌套select会影响效率吗? 以下2种写法我这数据量小看不出来,大家帮忙看下哪种更好?


nono26 上午好☀️☀️☀️️
本答案参考ChatGPT-3.5
在更新语句中嵌套Select语句会对查询效率产生影响,特别是在数据量较大的情况下。因为嵌套的Select语句需要进行额外的查询操作,增加了数据库的负载和查询时间。因此,我们应该尽量避免在更新语句中嵌套Select语句。
针对你提供的两种写法,我们可以进行一些优化,减少嵌套Select语句对效率的影响。以下是两种写法的优化方案:
第一种写法的优化方案:
优化后的代码如下:
-- 创建临时表或表变量来存储两个查询的结果
DECLARE @tempTable TABLE (
warehouse PK,
invbasdoc PK,
fQuantity FLOAT,
fPrice FLOAT,
fMoney FLOAT,
iModifier INT
)
-- 第一个查询,获取x的值
INSERT INTO @tempTable
SELECT x.pk warehouse, x.pk invbasdoc, x.fQuantity, x.fPrice, x.fMoney, x.iModifier
FROM EI WarehouseStock x
WHERE x.pk warehouse = @ID
-- 第二个查询,获取y的值
INSERT INTO @tempTable
SELECT a.pk warehouse, b.pk invbasdoc, b.fQuantity, b.fPrice, b.fMoney, a.iModifier
FROM EV PurchaseIn h a
LEFT JOIN EV PurchaseIn bb ON b.PNhid = a.PNhid
WHERE a.PNhid = @ID
-- 更新操作,根据临时表或表变量中的结果进行更新
UPDATE s
SET fQuantity = x.fQuantity + y.fQuantity,
fPrice = (x.fMoney + y.fMoney) / (x.fQuantity + y.fQuantity),
fMoney = x.fMoney + y.fMoney
FROM EI WarehouseStock s
INNER JOIN @tempTable x ON s.pk warehouse = x.warehouse AND s.pk invbasdoc = x.invbasdoc
INNER JOIN @tempTable y ON s.pk warehouse = y.warehouse AND s.pk invbasdoc = y.invbasdoc
第二种写法的优化方案:
优化后的代码如下:
UPDATE s
SET fQuantity = x.fQuantity + b.fQuantity,
fPrice = (x.fMoney + b.fMoney) / (x.fQuantity + b.fQuantity),
fMoney = x.fMoney + b.fMoney,
iModifier = a.iModifier,
dModifytime = CONVERT(varchar(19), GETDATE(),120)
FROM EI WarehouseStock s
INNER JOIN EV PurchaseIn h a ON a.pk warehouse = s.pk warehouse
INNER JOIN EV PurchaseIn bb b ON b.PNhId = a.PNhId AND b.pk invbasdoc = s.pk invbasdoc
INNER JOIN EI WarehouseStock x ON x.pk warehouse = s.pk warehouse
WHERE a.PNhid = @ID
通过拆分和优化查询语句,可以减少嵌套Select语句对更新操作效率的影响,提高查询性能。