sqlserver 億級資料刪除方案

net小雪發表於2024-05-13

sqlserver 刪除百萬級別及以上資料的時候需要考慮是否需要保留日誌檔案,如果需要保留日誌檔案,用於恢復。那麼就要使用DELETE語句進行刪除,DELETE刪除語句儘量使用主鍵或者索引的欄位,

同時進行批次刪除語句如下:

 1 DECLARE @BatchSize INT
 2 SET @BatchSize = 10000 -- 設定每批刪除的記錄數量
 3  
 4 WHILE 1 = 1
 5 BEGIN
 6     DELETE TOP (@BatchSize) FROM YourTable
 7     WHERE YourIDColumn IN (SELECT TOP (@BatchSize) YourIDColumn FROM YourTable)
 8     IF @@ROWCOUNT < @BatchSize
 9         BREAK
10 END

如果說不考慮恢復日誌,那麼可以對錶資料直接清空,如果表id是自增truncate語句會使表id從1開始。

1 truncate table 表名稱         -- 清空表

表清空後,磁碟空間可能不會完全釋放,這是因為InnoDB 中採用了 B+ 樹作為儲存資料的結構,也就是常說的索引組織表。在InnoDB中,delete操作並不會真的刪除資料,SQL Server實際上只是給要刪除的資料打了標記,標記為刪除。磁碟所佔空間不會變小,即表空間並沒有真正被釋放。可以使用一下語句進行空間收縮。

DBCC SHRINKDATABASE ( 資料庫名稱 )

刪除表的語句效率對比:

delete 表名稱 where 刪除條件    -- 刪除資料,執行效率低
drop table 表名稱        -- 刪除表,效率一般
truncate table 表名稱         -- 清空表,效率高

刪除資料主要就是是否考慮恢復。選擇合適自己業務場景的方式對資料庫進行相應的操作。

相關文章