删除超过600万行所以慢

时间:2015-04-29 08:10:04

标签: sql sql-server tsql loops

我有一个需要删除超过600万行的SP。

我尝试了这种方法,但执行时间仍然很慢。

DECLARE @continue BIT = 1

-- delete all ids not between starting and ending ids
WHILE @continue = 1
BEGIN

    SET @continue = 0

    DELETE top (10000) u
    FROM    Table1 u WITH (READPAST)
    WHERE       ID = @ID
    AND         NID IN (SELECT NID FROM #Node GROUP BY NID)

    IF @@ROWCOUNT > 0
        SET @continue = 1 

end

还有其他建议吗?

1 个答案:

答案 0 :(得分:2)

您的循环逻辑看起来不错

正如其他人所说的那样看应用设计
您可以使用登台表并能够截断

如果表格有FK并且你确信你不会违反它们,那么禁用FK并重新启用

如果你有一个删除触发器,你需要每天删除600万,那么你真的需要重新评估设计

查看优化选择然后将其放入删除

select top (10000) u
  FROM Table1 u WITH (READPAST)
  JOIN #Node 
    on u.NIT = #Node.NIT 
   and u.ID = @ID