使用计数优化DELETE语句

时间:2010-09-28 16:56:44

标签: sql sql-server-2005 tsql

您认为以下哪两项陈述对删除大量行最有效?

声明#1:

DELETE TOP (@count) FROM ProductInfo WHERE productId = @productid

声明#2:派生表

DELETE t1 FROM (SELECT TOP (@count) * from ProductInfo 
                WHERE productId = @productId v) t1

2 个答案:

答案 0 :(得分:6)

两者兼而有之。由于单个事务日志增长问题,在处理大量数据时需要批量删除。假设您要删除给定@productId的所有记录:

declare @batchSize int = 10000;
do while(1=1)
begin
   delete top(@batchSize) from ProductInfo where productId = @productId;
   if (0 = @@rowcount)
      break;
end

您发布的两种DELETE形式基本相同,重要的是表格由基于productId键的群集键组织。如果不是这样且您在productId上有NC索引,则必须校准@batchSize以避免index tipping point

答案 1 :(得分:2)

由于两个查询执行完全相同的任务,我会使用第一个任务,因为它更易于阅读和理解。

(另外,由于两个查询都做同样的工作,我怀疑他们会生成相同的执行计划 - 你能检查一下吗?)