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)
两者都没有.由于单个事务日志增长问题,在处理大量数据时需要批量删除.假设您要删除给定@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以避免索引引爆点.