sql server刪除大表數據總結


sql server對於大表數據(百萬、千萬級別)的刪除操作一定要注意,尤其是線上的數據更加要謹慎,一不注意可能要hang住整個數據庫導致網站或系統不可用。

因為刪除操作會記錄日志,如果刪除的數據比較多可能還會鎖表,這時其它的查詢如果沒有nolock就會阻塞,系統會卡住。

這里我把刪除分為兩種情況。

一、要刪除的數據占用總數據比例少,比如只占10%。

這個時候可以直接用delete,操作。使用分批,一次少量的刪除。比如以下是我們一個歷史表,要刪除200天以前的數據

WHILE 1 = 1
BEGIN
DELETE TOP(5000) FROM His_Order WHERE CreateDate<convert(char(10),GETDATE()-200,120);
IF @@rowcount < 5000
BREAK;
END

一次最多刪除5000條。

優點:基本上不影響線上業務,操作簡單。

缺點:操作時間長,生成的日志文件可能會很大。

二、要刪除的數據占用總數比較多,比如占用60%以上

也就是保留數據少數,大部分數據都是要刪除的。

這個時候我們可以采用把要保留的數據篩選出來插入到新表

select * into His_Order2 WHERE CreateDate>=convert(char(10),GETDATE()-200,120)

把新表和當前表重命名

--把不當前表重命名為備份表
EXEC sp_rename 'His_Order', 'His_Order_Bak'
--把要保留的新表重命名為線上可用的表
EXEC sp_rename 'His_Order2', 'His_Order

優點:操作速度快速,效率高

缺點:在重命名表的過程中會有短暫不可用或報錯情況,要處理要在轉移要保留數據的過過程中,要考慮和處理His_Order中的數據變更(要求不高的系統可以鎖表再操作)。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM