我有一个需要删除超过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
还有其他建议吗?
答案 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