我有一張有24億條記錄的表,我需要使用某些過濾器從該表中刪除約5億條記錄。從表sql服務器中刪除數百萬條記錄
這是我的查詢到目前爲止:
SET ROWCOUNT 1000
delete_more:
DELETE FROM hwbss..tblsdr WHERE dst <= 123456444
IF @@ROWCOUNT > 0 GOTO delete_more
SET ROWCOUNT 0
這需要大量的時間記錄刪除。
這是什麼問題,我該如何加快刪除速度。
我有一張有24億條記錄的表,我需要使用某些過濾器從該表中刪除約5億條記錄。從表sql服務器中刪除數百萬條記錄
這是我的查詢到目前爲止:
SET ROWCOUNT 1000
delete_more:
DELETE FROM hwbss..tblsdr WHERE dst <= 123456444
IF @@ROWCOUNT > 0 GOTO delete_more
SET ROWCOUNT 0
這需要大量的時間記錄刪除。
這是什麼問題,我該如何加快刪除速度。
首先,將數據庫恢復模型設置爲簡單。
ALTER DATABASE Database Name
SET RECOVERY SIMPLE
刪除操作日誌詳細信息爲每個和非常行,因此需要更多的時間,隨着日誌不斷增長。
然後,禁用約束和索引(如果有的話)。刪除操作完成後,您可以重建索引。
另一種方法:
您還可以插入現有表中的數據,除了500個M唱片公司與相同名稱的現有表的新表,但在不同的模式如Tmp.TableName
。然後您可以刪除現有表並使用
ALTER SCHEMA [SchemaName]
TRANSFER [Tmp].[TableName]
其中一些事實上是不正確的。無論是使用完整恢復還是簡單恢復,每個數據操作都會寫入日誌。不同之處在於日誌記錄可以重複使用,並防止不必要地增加日誌文件。此外,請檢查是否需要完整備份才能真正使新恢復模式生效。 – ErikE
是的,在將恢復模式設置爲簡單之前,您應該對數據庫進行完全備份或差異備份。這是因爲在將恢復模式設置爲簡單後,在達到特定限制時,存儲在.ldf文件中的事務日誌將被截斷。因此,只有在簡單恢復模式的情況下,才能恢復數據庫直到最後一次完整/差異備份。這不是一個先決條件,但是,最好避免在發生故障時丟失任何數據。刪除後,您可以使用ALTER DATABASE將恢復模式設置爲全部數據庫名稱SET RECOVERY FULL –
我刪除了我的第一條評論。請參閱我上面更新的一個。 – ErikE
更改Tmp表的架構您是否對該表有索引和約束?這可能是一個好主意,禁用/刪除這些,然後做刪除,然後重新啓用/重新創建它們。但刪除**那麼多的數據**只需要一些時間! –