nono26 2024-03-16 10:47 采纳率: 0%
浏览 25

update里嵌套select会影响效率吗?

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

img

img

  • 写回答

3条回答 默认 最新

  • 檀越@新空间 2024-03-16 10:48
    关注

    nono26 上午好☀️☀️☀️️
    本答案参考ChatGPT-3.5

    在更新语句中嵌套Select语句会对查询效率产生影响,特别是在数据量较大的情况下。因为嵌套的Select语句需要进行额外的查询操作,增加了数据库的负载和查询时间。因此,我们应该尽量避免在更新语句中嵌套Select语句。

    针对你提供的两种写法,我们可以进行一些优化,减少嵌套Select语句对效率的影响。以下是两种写法的优化方案:

    第一种写法的优化方案

    1. 首先,将嵌套的Select语句拆分成两个独立的查询,分别获取x和y的值,并通过表别名进行引用。
    2. 将两个查询的结果作为一个临时表或表变量存储起来,可以减少对表的多次查询,提高效率。
    3. 根据两个查询结果的关联条件进行更新操作。

    优化后的代码如下:

    -- 创建临时表或表变量来存储两个查询的结果
    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
    

    第二种写法的优化方案

    1. 将嵌套的Select语句拆分成两个独立的查询,分别获取a、x、b的值,并通过表别名进行引用。
    2. 根据两个查询结果的关联条件进行更新操作。

    优化后的代码如下:

    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语句对更新操作效率的影响,提高查询性能。

    评论

报告相同问题?

问题事件

  • 创建了问题 3月16日