高併發 OLTP 系統中,頻繁 COMMIT 導致 log file sync 等待事件飆升,成為寫入瓶頸。Oracle 10g R2 引入 Asynchronous Commit(非同步提交),允許 COMMIT 立即返回,由 LGWR 批次異步刷盤。本文解析 COMMIT_WRITE 參數機制、系統/會話級配置、風險權衡與適用場景。
| 階段 | 傳統 (同步) | 非同步 (NOWAIT + BATCH) |
|---|---|---|
| 用戶發起 COMMIT | 等待 LGWR 將 redo 寫入 Online Redo Log 並確認 | 立即返回,不等待 LGWR |
| LGWR 行為 | 每次 COMMIT 喚醒,單次寫入 | 累積多筆 redo,批次寫入(BATCH) |
| 持久性保證 | 強一致,Commit 即持久 | **可能丟失尚未刷盤的已提交事務** |
| log file sync 等待 | 高併發下明顯 | 大幅降低甚至消失 |
ALTER SYSTEM SET COMMIT_WRITE = 'BATCH,NOWAIT' SCOPE=SPFILE;
-- 或分開設定
ALTER SYSTEM SET COMMIT_WRITE = 'BATCH' SCOPE=SPFILE;
ALTER SYSTEM SET COMMIT_WRITE = 'NOWAIT' SCOPE=SPFILE;
SCOPE=SPFILE 需重啟生效;SCOPE=MEMORY 即時生效但重啟失效。
-- 單次提交
COMMIT WRITE BATCH NOWAIT;
-- 會話級持久
ALTER SESSION SET COMMIT_WRITE = 'BATCH,NOWAIT';
WAIT(預設):等待 LGWR 寫入完成NOWAIT:不等待,立即返回IMMEDIATE(預設):每次 COMMIT 觸發 LGWR 寫入BATCH:累積 redo 批次寫入,減少 I/O 次數推薦組合:BATCH, NOWAIT 效能增益最大,但風險也最高。
| 適用 | 禁用 |
|---|---|
| 高頻寫入、可容忍極少量數據丟失的日誌/統計/遙測系統 | 核心交易、財務、庫存、訂單等強一致性業務 |
| 大批次載入(配合 NOLOGGING)追求極致載入速度 | 需支援時間點恢復 (PITR) 的關鍵系統 |
| 測試/開發環境加速迭代 | Data Guard Maximum Protection/Availability 模式 |
-- 觀察 log file sync 等待時間下降
SELECT event, total_waits, time_waited_micro
FROM v$system_event
WHERE event = 'log file sync';
-- 確認參數生效
SHOW PARAMETER commit_write;
COMMIT_WRITE = BATCH,NOWAIT 是用「有限數據風險」換取「極致寫入吞吐」的利器。**嚴禁用於核心業務**;若使用,必須:
對多數系統,**優化提交頻率(批次提交)、調大 Redo Log、使用 SSD 存放 Redo** 才是正統調優路徑。