我有一张表,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])
也许别的东西吗?
当您尝试时发生了什么?执行计划对两种表述都说了什么? – 2012-03-29 20:00:56
*一般*不推荐使用'WHERE IN'。 “WHERE EXISTS”更普遍被接受。但不管怎么说,MERGE的设计是为了*更多*而非*更快*。但为什么有人会说,为什么不自己测试所有的选项? * [另外,请注意,通常不建议使用GUID作为主键。如果你的PK是你的聚簇键,你将会像无体的业务一样分割表 - 因为GUID不是按顺序生成的,所以新条目需要插入表中的随机位置,而不是在末尾插入。] * – MatBailie 2012-03-29 20:06:49
@Dems - 好建议。我想补充一点,如果你使用Guids作为主键,只需创建它们(或者改变它们)为非集群。我们注意到,通过进行这种改变,我们的环境显着提高了性能 – RQDQ 2012-03-29 20:52:27