原文:https://blog.csdn.net/songyanjun2011/article/details/7308414
SQL Server上面刪除1.6億條記錄,不能用Truncate(因為只是刪除其中少部分數據)。
經過實驗,每次刪除400萬條要花1.5 - 3小時,而且是越到后面越慢,正常的話,需要大約102個小時,大約4天半時間。這在生產環境下是不能接受的。
經過一個處理之后,我每次刪除400萬條記錄花5 - 6分鍾,刪除全部1.6億條記錄花了4 - 5個小時!
為什么??
每次刪除記錄,數據庫都要相應地更新索引,這是很慢的IO操作,而且后面索引碎片越來越多,就更慢,這就是為什么一開始只花1.5小時,后面要3小時才能刪除400萬條記錄的原因。
刪除之前,做個完整備份。
我在刪除前先保存當前索引的DDL,然后刪除其索引,
然后根據使用的刪除條件建立一個臨時的索引(這是提高速度的另外一個重要原因!)
開始刪除操作,完成之后再重建之前的索引。
我在刪除前先保存當前索引的DDL,然后刪除其索引,
然后根據使用的刪除條件建立一個臨時的索引(這是提高速度的另外一個重要原因!)
開始刪除操作,完成之后再重建之前的索引。
如果需要保留的數據比較少的話,可以把要保留的數據備份出來。在drop表。重新創建,先不要急着創建索引、主鍵,把數據導回去,然后在建索引、約束之類的。
記得在刪除的時候不要在記錄日志的模式下面,否則日志文件就要爆了。
2、在My SQL數據庫使用中,有的表存儲數據量比較大,達到每天三百萬條記錄左右,此表中建立了三個索引,這些索引都是必須的,其他程序要使用。
由於要求此表中的數據只保留當天的數據,所以每當在凌晨的某一時刻當其他程序處理完其中的數據后要刪除該表中昨天以及以前的數據,使用delete刪除表中的上百萬條記錄時,MySQL刪除速度非常緩慢每一萬條記錄需要大概4分鍾左右,這樣刪除所有無用數據要達到八個小時以上,這是難以接受的。
查詢MySQL官方手冊得知刪除數據的速度和創建的索引數量是成正比的,於是刪除掉其中的兩個索引后測試,發現此時刪除速度相當快,一百萬條記錄在一分鍾多一些,可是這兩個索引其他模塊在每天一次的數據整理中還要使用,於是想到了一個折中的辦法:
在刪除數據之前刪除這兩個索引,此時需要三分鍾多一些,然后刪除其中無用數據,此過程需要不到兩分鍾,刪除完成后重新創建索引,因為此時數據庫中的數據相對較少,約三四十萬條記錄(此表中的數據每小時會增加約十萬條),創建索引也非常快,約十分鍾左右。這樣整個刪除過程只需要約15分鍾。對比之前的八個小時,大大節省了時間。
