直接對千萬筆資料執行 DELETE WHERE ... 會產生大量記錄檔、鎖定升級、回滾區塊膨脹,導致效能極差甚至填滿磁碟。本文提供三種分級策略,依業務容許度選擇最佳方案。
| 策略 | 適用場景 | 記錄檔影響 | 速度 | 可回覆 |
|---|---|---|---|---|
| TRUNCATE TABLE | 全表清空、無外鍵參考 | 極小(僅記錄頁釋放) | 毫秒級 | 不可 |
| SELECT INTO 新表 + TRUNCATE + RENAME | 保留部分資料、可接受短暫離線 | 中等(SELECT INTO 為大量記錄) | 秒~分級 | 不可 |
| 分批 DELETE (TOP n 迴圈) | 線上服務、不可停機、需保留近期資料 | 可控(每批次小交易) | 較慢但平穩 | 可 |
-- 1. 將需保留資料複製到新表(Full 復原模式下記錄檔較大)
SELECT * INTO Table2 FROM Table1 WHERE Time >= '2006-03-10';
-- 2. 瞬間清空原表(任何復原模式皆不記錄細節)
TRUNCATE TABLE Table1;
-- 3. 重新命名新表為原表名
EXEC sp_rename 'Table2', 'Table1';
DECLARE @BatchSize INT = 5000, @RowsAffected INT = 1;
WHILE @RowsAffected > 0
BEGIN
DELETE TOP (@BatchSize) FROM Table1
WHERE Time < '2006-03-10';
SET @RowsAffected = @@ROWCOUNT;
-- 可選:WAITFOR DELAY '00:00:01' 降低鎖定衝突
CHECKPOINT; -- Simple 模式下截斷記錄檔
END
SELECT name, recovery_model_desc FROM sys.databasesDBCC SQLPERF(LOGSPACE)sp_fkeys 'Table1'、sp_helptrigger 'Table1'選對策略,百萬級刪除也能在業務窗口內平穩完成,避免記錄檔暴漲導致服務中斷。