为什么批量删除记录比批量删除更好?

pkr*_*298 3 sql-server

这样的原因是什么?

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
Run Code Online (Sandbox Code Playgroud)

应该用来代替这样的东西吗?

DELETE st
FROM SomeTable st
JOIN #ToDelete ON #ToDelete.Id = st.Id
Run Code Online (Sandbox Code Playgroud)

HLG*_*GEM 10

当您删除大量记录时,可能会发生一些事情.

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

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

另一个可能导致大型删除特别慢的事情是,如果表上有触发器,尤其是在其中存在某种循环的触发器.

通常,当大量记录的删除花费太长时间并在此期间导致阻塞时,使用该技术.你按批次进行,因为它通常比一行快一行.

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

  • 除了防止锁定升级,保持批量较小也可以防止在数据库处于简单恢复模式时需要增长的事务日志. (2认同)