首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server In-Flight Log 實測:512 Bytes 至 60 KB 邊界驗證

     編輯:關於SqlServer

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

觀察結果

  • 資料庫初始記錄檔 5 MB,自動成長 5 MB。
  • 腳本執行後,記錄檔歷經 6 次自動成長 (5MB → 35MB)。
  • 每次成長約對應 60 KB × 多個 Log Block 累積觸發 Checkpoint/背景 Flush。
記錄檔自動成長 6 次截圖

理論與實測對照

大量交易累積至 60 KB 強制 Flush
理論值實測現象說明
單一 Log Block 上限 60 KBProcmon 擷取 WriteFile Length 多為 61,440 Bytes (60 KB)
Commit 觸發 Flush小交易 (單 INSERT) Commit 後,WriteFile 約 4 KB (配置單元)不足 60 KB 但因 Commit 立即寫入
最小 512 Bytes極小交易 (單欄位 UPDATE) 可能產生 512B~4KB 寫入受磁碟區配置單元影響,實際不小於配置單元

對 DBA 的啟示

  1. 記錄檔自動成長增量不宜過小:頻繁成長 (如本例 6 次) 造成 I/O 衝擊、VLF 碎片化。建議預先調整至預估峰值 (如 1~4 GB),成長增量設定固定值 (512 MB~1 GB) 而非百分比。
  2. 長交易 = 大量 In-Flight Log:若交易執行數分鐘未 Commit,Log Buffer 累積大量記錄,若此刻故障,恢復時間極長 (Redo 階段需重放所有 In-Flight Log)。
  3. 監控指標:sys.dm_db_log_space_usage (SQL 2012+)、DBCC SQLPERF(LOGSPACE)、效能計數器 Log Flushes/sec, Log Bytes Flushed/sec。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved