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

DB2 批量 INSERT 性能極致優化(下):頁清除、鎖、日志、提交與索引維護

     編輯:Oracle 資料庫基礎

前言

接上篇,本文深入剖析異步頁清除、鎖策略、日志配置、提交頻率、索引維護對批量插入性能的決定性影響。

一、異步頁清除:平衡插入速度與後續性能

  • 無頁清除:插入快,但結束後海量髒頁刷盤嚴重拖慢後續操作(甚至關庫)。
  • 積極頁清除:插入稍慢,但緩沖池髒頁少,後續任務更順暢。
  • 最佳實踐: 將 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% 表大小可考慮刪索引→插入→重建;否則用大索引緩沖池 + 預排序鍵值緩解。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved