前言
接上篇,本文深入剖析異步頁清除、鎖策略、日志配置、提交頻率、索引維護對批量插入性能的決定性影響。
一、異步頁清除:平衡插入速度與後續性能
- 無頁清除:插入快,但結束後海量髒頁刷盤嚴重拖慢後續操作(甚至關庫)。
- 積極頁清除:插入稍慢,但緩沖池髒頁少,後續任務更順暢。
- 最佳實踐: 將
CHNGPGS_THRESH 從 60 降至 5;啟用 DB2_USE_ALTERNATE_PAGE_CLEANING=ON(V8 FP4+);NUM_IOCLEANERS ≥ 物理存儲設備數。
二、I/O 優化
- 有索引時:大緩沖池可將索引構建 I/O 最小化。
- 無索引時:大緩沖池僅延遲 I/O,最終仍需刷盤。
- 常規手段:表空間跨多容器/磁盤;最快硬件+寫緩存+並行寫;避免 RAID5(除配高端存儲如 Shark)。
三、鎖策略:行鎖 vs 表鎖
默認每行持有 X 鎖至提交,兩大開銷:CPU 獲取/釋放鎖、並發衝突。
- 表鎖可減 3% 耗時,三種獲取方式:
ALTER TABLE LOCKSIZE TABLE、LOCK TABLE IN EXCLUSIVE MODE(需每次提交後重鎖)、縮小 LOCKLIST/MAXLOCKS 觸發升級。
- 代價:除 UR 隔離級外,所有應用無法訪問該表。
- 緩解衝突:增大
LOCKLIST/MAXLOCKS 避免誤升級;他應用用 UR;V8 FP4 開啟 DB2_EVALUNCOMMITTED=YES 減少掃描鎖;更頻繁 COMMIT 釋放鎖。
注意: V8 Type-2 索引已消除 V7 的鍵鎖並發問題,遷移時務必 REORG INDEXES ... CONVERT;V8 僅 Type-1 索引或 RR 隔離級下出現 W/NW 鎖,應避免。
四、日志優化:最小化寫次數與加速寫速度
- 日志緩沖池:
LOGBUFSZ 默認 8 頁(32K)偏小。例:每行 200 字節日志,1000 行約 6 次寫;增至 64 頁(256K)僅提交時 1 次寫,提升 ~13%。代價:崩潰恢復稍慢。
- NOT LOGGED INITIALLY (NLI): 單元內不記錄 INSERT,但失敗表標記不可訪問需重建;提交需等所有髒頁刷盤,若無積極頁清除反而更慢。謹慎使用,監控提交耗時。
- 加速日志寫: 日志與數據分盤;OS 層日志跨多盤;考慮原始設備;避免 RAID5。
五、提交頻率:每 1000 行提交一次
- 每行提交極差(同步 I/O 開銷大於 INSERT)。
- 關閉自動提交;每 ~1000 行提交,性能提升 ~10 倍;超 1000 行收益遞減且失敗恢復成本增大。
MINCOMMIT > 1 可合併日志 I/O,但批量插入常無效甚至負面,關鍵任務保持 =1。
六、可選優化:索引維護
- 每行插入需遍歷所有索引樹(CPU)+ 讀寫索引頁(I/O)。
- 隨機鍵值 + 小緩沖池 = 大量隨機 I/O,性能極差。
- 空表批量載入:先插數據後建索引(LOAD 需預建)。
- 非空表:插入量 > 10-20% 表大小可考慮刪索引→插入→重建;否則用大索引緩沖池 + 預排序鍵值緩解。