In-Flight Log:已在記憶體 (Log Buffer) 產生、尚未寫入磁碟的記錄區塊。大小受兩因素控制:上限 60 KB (Paul Randal 論述)、**交易 Commit/Rollback 觸發立即 Flush**。本文以迴圈大量插入實測記錄檔自動成長對應的 In-Flight 區塊大小。
USE TestDB;
GO
CREATE TABLE dbo.Number (n INT);
GO
BEGIN TRAN
DECLARE @i INT = 0;
WHILE @i < 100000
BEGIN
INSERT INTO dbo.Number VALUES (@i);
SET @i += 1;
END
CHECKPOINT; -- 強制髒頁寫入,觀察純記錄檔行為
COMMIT;
GO
| 理論值 | 實測現象 | 說明 |
|---|---|---|
| 單一 Log Block 上限 60 KB | Procmon 擷取 WriteFile Length 多為 61,440 Bytes (60 KB) | |
| Commit 觸發 Flush | 小交易 (單 INSERT) Commit 後,WriteFile 約 4 KB (配置單元) | 不足 60 KB 但因 Commit 立即寫入 |
| 最小 512 Bytes | 極小交易 (單欄位 UPDATE) 可能產生 512B~4KB 寫入 | 受磁碟區配置單元影響,實際不小於配置單元 |
sys.dm_db_log_space_usage (SQL 2012+)、DBCC SQLPERF(LOGSPACE)、效能計數器 Log Flushes/sec, Log Bytes Flushed/sec。