我有一个表 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/