使用计数优化DELETE语句

RPS*_*RPS 2 sql t-sql sql-server-2005

您认为以下哪两个语句对删除大量行最有效?

声明#1:

DELETE TOP (@count) FROM ProductInfo WHERE productId = @productid
Run Code Online (Sandbox Code Playgroud)

声明#2:派生表

DELETE t1 FROM (SELECT TOP (@count) * from ProductInfo 
                WHERE productId = @productId v) t1
Run Code Online (Sandbox Code Playgroud)

Rem*_*anu 6

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

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

您发布的两种形式的DELETE基本相同,重要的是表是由基于productId密钥的聚簇键组织的.如果不是这样并且你有一个NC索引,productId则必须校准@batchSize以避免索引引爆点.