SQL Server 將實體記錄檔內部分割為多個虛擬記錄檔(VLF),以便追蹤可重複使用的區段。然而,不當的自動成長設定會導致 VLF 數量暴增,形成「VLF 碎片」,嚴重拖垮資料庫效能。
每次記錄檔成長(自動或手動)時,依成長大小劃分 VLF:
| 成長大小 | VLF 數量 | 單一 VLF 大約大小 |
|---|---|---|
| ≤ 1 MB | 2 | 1/2 總大小 |
| 1 MB ~ 64 MB | 4 | 1/4 總大小 |
| 64 MB ~ 1 GB | 8 | 1/8 總大小 |
| > 1 GB | 16 | 1/16 總大小 |
例如:一次建立 8 GB 記錄檔 → 16 個 VLF(各 512 MB);若後續以 4 GB 自動成長 → 新增 16 個 VLF(各 256 MB),總計 32 個 VLF。
DBCC LOGINFO; -- 輸出行數即為 VLF 數
BACKUP LOG)。DBCC SHRINKFILE (logfile, target_size) 手動收縮至最小。預設 10% 會導致成長量越來越大,產生大量小 VLF。建議設定固定值(如 32 MB、64 MB、256 MB),並預先將記錄檔擴展至穩態大小。
若業務導致記錄檔反覆成長至 X 大小,直接將初始大小設為 X 並管理 VLF,免去反覆零初始化的效能代價。
多檔案不提升效能(記錄寫入是循序的),反而增加還原時的零初始化時間,延長 RTO。
服務重啟後 Tempdb 會縮回初始大小,若未預先調大,重啟後會因反覆成長而效能受損。
從快照還原會重建兩個 0.25 MB 的微小 VLF,必須立即手動成長至最佳大小,否則後續自動成長又會產生碎片。
健康的交易記錄檔 = 適當的初始大小 + 固定增量 + 受控的 VLF 數量(< 1,000)。搭配監控自動成長頻率與 I/O 延遲,即可維持穩定效能。