Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么批量删除记录比批量删除好?_Sql Server - Fatal编程技术网

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

Sql server 为什么批量删除记录比批量删除好?,sql-server,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 删除大量记录时,可能会发生几种情况 首先,您可能启用了cascade delete,在这种情况下,从主表中删除10000条记录可

为什么会这样

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

删除大量记录时,可能会发生几种情况

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

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

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

一般来说,当删除大量记录会花费太长时间并同时导致阻塞时,使用此技术。您可以分批进行,因为这通常比一次一行快


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

谁说应该使用第一个片段而不是第二个片段?谁说更好?为什么要将其限制为100次迭代,因此最多只能删除2000行?@Stijn和其他谷歌搜索通常会说在中删除batches@Codo只是一个例子应该提到的是,在大多数情况下,一次删除所有内容是最快的。不过,您提到的问题是有道理的。大多数情况下,最快速度是好的,除非它会导致阻塞。在这种情况下,最好使用一个较慢的进程,让其他进程能够工作。在防止锁升级的同时,保持小批量也可以防止在数据库处于简单恢复模式时需要增加事务日志。
DELETE st
FROM SomeTable st
JOIN #ToDelete ON #ToDelete.Id = st.Id