在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;
答案 0 :(得分:2)
除非您按时间(懒惰)并且您知道第二种形式不是必需的,否则第二种形式在生产繁忙的系统中始终是首选。
你应该加强第二个,以便不进行身份更新(更新导致无变化)。目前,您的代码将更新记录,即使它之前和之后完全相同 - 在这种情况下,它几乎与第一个表单相同。
一些差异:
答案 1 :(得分:1)
此将完全取决于您当前的数据结构。有哪些领域?多少?什么是指数?您要插入/更新/选择的表有多大?
你的第一个替代方案涉及的逻辑较少,并且可能更快,但它将取决于你要更新的字段,有多少字段,值和数据类型是什么,什么索引等。
简短回答 - 取决于。
在SQL中(通常)没有“最佳”答案。对于特定情况,有一个最佳解决方案,但如果您不分享详细信息,您将无法得到一个好的答案。
此外,BULK INSERT
是一种特殊的功能,通常使用BCP
。您可以执行minimally logged
插入,但列出的内容不是BULK INSERT
。