首页 > 解决方案 > 使用多个更新或内部连接对性能更好

问题描述

我在触发器中使用了以下更新语句,它具有相同的行为,并且两者都是正确的,但是如果我同时更新 tableA_ID 和 ValueB,第二个就会出现问题。但这不是大问题,因为有解决方法,但如果可能的话,我想避免它。所以我想知道的是这两个之间有很大的表现,它会让我决定去哪一个。如果第二个性能比我使用第二个好得多。但是,如果差异不是那么大,我将使用第一个。我不是 sql server 方面的专家。任何人都可以帮忙吗?

        UPDATE tableA
        SET tableA.Value = tableA.Value - old.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM deleted
                    ) old ON old.tableA_ID = tableA.ID

        UPDATE tableA
        SET tableA.Value = tableA.Value + new.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM inserted
                    ) new ON new.tableA_ID = tableA.ID
        UPDATE tableA
        SET tableA.Value = tableA.Value - old.ValueB + new.ValueB
        FROM tableA
        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM deleted
                    ) old ON old.tableA_ID = tableA.ID

        INNER JOIN (
                        SELECT tableA_ID ,ValueB
                        FROM inserted
                    ) new ON new.tableA_ID = tableA.ID

标签: sql-serverperformance

解决方案


与任何事情一样,请对其进行测试以确定。

您是否应该在触发器中执行此操作是一个漫长的讨论。

在性能方面,在大多数情况下,第二个查询将获得更好的性能。我可以简单说明的原因是,您只在一次更新所有内容的查询中查看 UPDATE 的单个查找。然而,第一个查询必须两次找到要更新的数据。

但是,再次测试一下。

是的,正如@SMor 在评论中所说,绝对应该讨论为什么需要将其作为触发器。触发器可能会被严重误用和滥用。


推荐阅读