業務表 (如 `OrderLog`、`OperationRecord`) 僅需保留近 N 天 (如 10/30/90 天) 資料,超期自動刪除,控制表體積與備份窗口。


DELETE FROM dbo.OrderLog WHERE DATEDIFF(DAY, CAST(SUBSTRING([LogTime], 1, 8) AS DATE), GETDATE()) > 10;




DELETE FROM dbo.OrderLog WHERE DATEDIFF(DAY, CAST(SUBSTRING([LogTime], 1, 8) AS DATE), GETDATE()) > 10;
DECLARE @CutoffDate DATE = DATEADD(DAY, -10, CAST(GETDATE() AS DATE)); DELETE FROM dbo.OrderLog WHERE CAST(SUBSTRING([LogTime], 1, 8) AS DATE) < @CutoffDate;
-- 1. 新增計算欄位 ALTER TABLE dbo.OrderLog ADD LogDate AS CAST(SUBSTRING([LogTime], 1, 8) AS DATE) PERSISTED; -- 2. 建立索引 CREATE INDEX IX_OrderLog_LogDate ON dbo.OrderLog (LogDate); -- 3. 刪除語句 (純粹範圍查詢,Index Seek) DELETE FROM dbo.OrderLog WHERE LogDate < DATEADD(DAY, -10, CAST(GETDATE() AS DATE));
DECLARE @BatchSize INT = 5000, @RowsAffected INT = 1, @CutoffDate DATE = DATEADD(DAY, -10, CAST(GETDATE() AS DATE));
WHILE @RowsAffected > 0
BEGIN
DELETE TOP (@BatchSize) FROM dbo.OrderLog
WHERE LogDate < @CutoffDate; -- 需配合計算欄位索引
SET @RowsAffected = @@ROWCOUNT;
WAITFOR DELAY '00:00:01'; -- 緩衝 1 秒,釋放鎖、讓記錄檔截斷
END
| 資料量 | 推薦方案 |
|---|---|
| < 100 萬行 | Agent 作業 + SARGable 刪除 + 計算欄位索引 |
| 100 萬 ~ 1 億行 | 分批刪除 (5k~10k/批) + 計算欄位索引 + 記錄檔監控 |
| > 1 億行 | 分區表 + SWITCH OUT + TRUNCATE (架構層面解決) |
**核心原則**:避免欄位套函數、分批提交、監控記錄檔、備份前驗證可恢復性。