哪个更快/更好:UPDATE WHERE IN或MERGE?

时间:2012-03-29 19:58:06

标签: sql sql-server-2008 tsql

我有一张表TBL1,只有GUID。

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

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

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])

或者别的什么?

2 个答案:

答案 0 :(得分:3)

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

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

没有计划进行诊断就是猜测。看看计划和/或衡量标准。测量提供了答案,但计划提供了答案的理解

答案 1 :(得分:1)

我认为最快的方法可能是使用连接的第三种选择:

UPDATE t1 SET StatusColumn=0
FROM db.dbo.TBL1 t1
INNER JOIN db.dbo.TBL2 t2 ON t1.guid = t2.guid