大型DELETE(刪除大量數據)的一種解決方案

經過執行單條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
相關文章
相關標籤/搜索