3

像这样的原因是什么

DECLARE @i int = 0
WHILE @i < 100 BEGIN
  BEGIN TRAN
    SET @i = @i + 1

    DELETE TOP (20) st
    FROM SomeTable st
    JOIN #ToDelete ON #ToDelete.Id = st.Id
  COMMIT
END

应该使用而不是这样的东西?

DELETE st
FROM SomeTable st
JOIN #ToDelete ON #ToDelete.Id = st.Id
4

1 回答 1

11

当您删除大量记录时,可能会发生几件事。

首先,您可能打开了级联删除,在这种情况下,从主表中删除 10000 条记录可能会导致在考虑所有子表时删除数百万条记录。即使没有级联删除,如果有很多子表,都必须检查它们以确保在删除之前没有记录。

此外,像这样的删除可能会升级表上的锁定,以便在删除发生时没有其他人可以使用该表。当使用级联删除时,这甚至是一个更大的问题,因为该过程将花费更长的时间并且更多的表可能会被锁定。

可能导致大删除速度特别慢的另一件事是表上是否有触发器,尤其是其中有某种循环的触发器。

通常,当删除大量记录需要太长时间并同时导致阻塞时,会使用此技术。您分批进行,因为这通常比一次快一排。

这不是您每次删除一批记录时都需要使用的技术,如果在没有子记录和/或没有触发器的表中删除需要几秒钟,则没有必要。如果该表不是其他人通常会在删除时同时访问的表(例如在非工作时间执行删除的作业),则不需要使用该技术。

于 2013-10-16T14:41:32.460 回答