大批量delete 優化方案


超過100萬以上數據 刪除的時候 會非常慢且產生大量日志文件 最大的問題是內存爆表 導致得多次重啟服務才能刪除整個庫 暫時提出初步優化方案

1.設置日志為簡單模式,處理完后恢復

ALTER DATABASE tcgpsdb SET RECOVERY SIMPLE --簡單模式
ALTER DATABASE tcgpsdb SET RECOVERY FULL --還原為完全模式

2.delete的時候 會造成整表鎖定,所以采用分批刪除

@onecount 這里設置為一百萬一次,可以自由調節

declare @onecount int
set @onecount=1000000
print getdate()
while 1=1
begin
     delete top(@onecount) from XX where FSendTime<'2019-1-01'
     IF (@@rowcount<@onecount) BREAK;
     print getdate()
end

刪除一千多萬條數據耗時 注意:搜索時間字段有加索引

02  1 2019 11:25AM

(1000000 行受影響)
02  1 2019 11:26AM

(1000000 行受影響)
02  1 2019 11:27AM

(1000000 行受影響)
02  1 2019 11:27AM

(1000000 行受影響)
02  1 2019 11:28AM

(1000000 行受影響)
02  1 2019 11:28AM

(1000000 行受影響)
02  1 2019 11:29AM

(1000000 行受影響)
02  1 2019 11:29AM

(1000000 行受影響)
02  1 2019 11:30AM

(1000000 行受影響)
02  1 2019 11:31AM

(1000000 行受影響)
02  1 2019 11:31AM

(636657 行受影響)

 

另外還有 插入到新表然后 drop 老表 把新表改為原來表名 這種涉及停機 所以暫不考慮

以上方案還是不夠理想,這里拋磚迎玉 希望有更好的同學能給出 更快速 更省內存的解決方案

 


免責聲明!

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



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