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 表名稱 -- 清空表,效率高
刪除資料主要就是是否考慮恢復。選擇合適自己業務場景的方式對資料庫進行相應的操作。