这些SQL-Server-2005 MERGE替代方案如何进行比较

时间:2011-04-19 16:34:03

标签: sql-server sql-server-2005

在SQL-Server-2005中,如何在批量更新数据的性能方面比较以下方法。

批量删除然后批量插入

--Delete Existing Data
DELETE FROM Foo
WHERE Category = 1;

--Insert New Data
INSERT INTO Foo (Id, Category, ...)
SELECT Id, Category, ...
FROM @Temp;

(合并样式)批量插入/更新/删除

--Delete Existing Data Not In New Data
DELETE FROM Foo 
FROM Foo LEFT OUTER JOIN @Temp T ON Foo.Id = T.Id
WHERE Foo.Category = 1
AND T.Id IS NULL;

--Update Matching Data
UPDATE Foo
SET
    Foo.Category = T.Category,
...
FROM Foo INNER JOIN @Temp T ON Foo.Id = T.Id;

--Insert New Data
INSERT INTO Foo (Id, Category, ...)
SELECT Id, Category, ...
FROM @Temp T LEFT OUTER JOIN Foo F ON F.Id = T.Id
WHERE F.Id IS NULL;

2 个答案:

答案 0 :(得分:2)

除非您按时间(懒惰)并且您知道第二种形式不是必需的,否则第二种形式在生产繁忙的系统中始终是首选。

你应该加强第二个,以便不进行身份更新(更新导致无变化)。目前,您的代码将更新记录,即使它之前和之后完全相同 - 在这种情况下,它几乎与第一个表单相同。

一些差异:

  • 在正确的第二种形式中,附加引用(外键挂钩)的现有记录不会被破坏,而第一种形式可能会破坏,因为它会尝试暂时删除所有记录。
  • 正确的第二种形式记录较少
  • 正确的第二种形式在触发器中没什么作用(如果表有触发器)

答案 1 :(得分:1)

将完全取决于您当前的数据结构。有哪些领域?多少?什么是指数?您要插入/更新/选择的表有多大?

你的第一个替代方案涉及的逻辑较少,并且可能更快,但它将取决于你要更新的字段,有多少字段,值和数据类型是什么,什么索引等。

简短回答 - 取决于。

在SQL中(通常)没有“最佳”答案。对于特定情况,有一个最佳解决方案,但如果您不分享详细信息,您将无法得到一个好的答案。

此外,BULK INSERT是一种特殊的功能,通常使用BCP。您可以执行minimally logged插入,但列出的内容不是BULK INSERT