sql - 哪个更快/更好 : UPDATE WHERE IN or MERGE?

标签 sql sql-server-2008 t-sql

我有一个表 TBL1,仅包含 GUID。

我有另一个表,TBL2,其中主键是 GUID,它还有一些其他列。我想根据 GUID 是否在 TBL1 中更新 TBL2 表中的一列。

使用以下哪个查询更快和/或更可靠?

MERGE INTO [db].[dbo].[TBL1] AS target
    USING [db].[dbo].[TBL2] as source
        ON target.GUID = source.GUID
    WHEN MATCHED THEN
        UPDATE SET
            StatusColumn = 0;

UPDATE [db].[dbo].[TBL1]
    SET StatusColumn=0
    WHERE GUID IN (SELECT GUID FROM [db].[dbo].[TBL2])

或者也许是别的什么?

最佳答案

这个问题的答案只能来自于执行计划。从您发布的计划(http://i.imgur.com/6vB2t.png)中我们可以看到以下内容:

  • IN 正在生成左连接。这样效率稍微高一点。还有一个优化器弱点,导致优化器无法从显式连接生成半连接,即使可以。
  • 合并正在对行进行排序。这是因为您可能会从加入中获得重复项!如果这是不可能的,合并也会同样快。
  • 我猜显式连接版本与合并一样快。

没有计划就诊断这个问题只是猜测。查看计划和/或措施。测量提供了答案,但计划提供了对答案的理解

关于sql - 哪个更快/更好 : UPDATE WHERE IN or MERGE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9932561/

相关文章:

sql-server-2008 - Microsoft SQL Server 2008 Management Studio - 连接/服务器/实例问题

sql - Microsoft SQL 查询时间戳中的小时数

sql - 如何根据其他值的组合来编写值

SQL-Server:在列上创建带有子字符串的 View ,当有数据时子字符串返回null

java - 我们如何计算 mongodb java 中不同文档的 arraylist 中的项目数?

java - 用于分页 SELECT sql 查询的通用查看器

mysql - 使用连接从两个表中选择

mysql - SQL:从另一个表更新一个表

java - 从 Java 登录到 MSSQL 服务器的问题

sql - T-SQL IF 语句解释