經過執行單條DELETE語句來刪除一個大型的數據集會有如下的缺點:spa
1.DELETE語句的操做要被完整地記錄到日誌中,這要求在事務日誌中要有足夠的空間以完成整個事務;日誌
2.在刪除操做期間(可能會花費很長時間),從最先打開的事務到當前時間點的全部日誌都不能被重寫;並且,若是因爲某種緣由,事務被中斷,此前發生的全部操做都將被回滾,這也會花費一些時間;code
3.當同時刪除許多行時,SQL Server可能會把被刪除行上的單一鎖升級爲排他鎖,以阻止DELETE完成以前對目標表的讀寫訪問。blog
想避免以上的問題,能夠參考下面的這種方案的代碼:事務
WHILE 1 = 1 BEGIN DELETE TOP (5000) FROM dbo.LargeOrders WHERE orderdate < '20070101'; IF @@rowcount < 5000 BREAK; END GO
經過相似的方式,也能夠把大型UPDATE操做拆分到多個批次中,只要正在修改的屬性也是篩選器所使用的屬性,代碼:class
WHILE 1 = 1 BEGIN UPDATE TOP (5000) dbo.LargeOrders SET custid = 123 WHERE custid = 55; IF @@rowcount < 5000 BREAK; END GO