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

DB2 性能調優 20 大認知誤區:從邏輯設計到鎖管理的深度辯析

     編輯:DB2 教學

前言

性能調優不僅是參數調整,更是打破固有認知偏見的過程。本文梳理 20 個高頻誤區,對比「流傳認知」與「實戰真相」,幫助 DBA 建立科學調優思維。

#流傳認知(誤區)實戰真相
1邏輯設計應完全映射物理設計為性能可適度反範式化、分區、冗余列、物化視圖,物理設計不受邏輯約束
2所有對象放入 BP0 讓 DB2 自管僅極小內存(<10k 頁)且無調優資源時才這樣做。生產環境應按表空間/對象類型劃分多緩衝池,BP0 僅留目錄表
3DSNDB07 (工作文件) 100% 順序訪問實際 3%-45% 隨機讀寫(排序溢寫、雜湊連接溢寫),需獨立緩衝池與高速磁盤
4VARCHAR 應放行末唯有「高頻更新、低讀取」表才放行末;多讀少寫表放行首減少 CPU 開銷,壓縮表更不適用
5代碼應遵循邏輯流程編寫OLTP 核心路徑需按「最小掃描、最早過濾、索引覆蓋」重寫,偽代碼邏輯常導致全表掃描
6大多數業務邏輯不在 SQL 中處理SQL 是集合處理器,擅長聚合/連接/窗口函數,將邏輯下推到引擎層通常比應用層快數量級
7代碼檢查應用 RI (Referential Integrity)RI 僅用於真實父子關係強制完整性,不用作應用層輸入驗證的捷徑(觸發器/應用驗證更靈活)
8表至多 1-2 個索引索引數量由查詢模式決定,OLTP 表 5-10 個索引常見,關鍵是監控 INDEXUSED 清理無效索引
9非分區索引 (NPI) 不可用,尤其大表NPI 對跨分區查詢、全局唯一性約束不可或缺,現代版本已優化 NPI 維護開銷
10大表必須分區分區主要為管理便利(滾入/滾出、備份粒度),純性能視角 60 億行單分區表同樣可高效運行
11DB2 默認參數即最佳默認值隨版本變化,關鍵參數(如 CURRENTDATA、LOCKSIZE、OPTIMIZATION LEVEL)必須按負載調優
12WHERE 子句禁用否定謂詞 (NOT, !=, <>)僅當否定謂詞導致全表掃描時才需改寫;多數情況下引擎內部過濾效率更高
13只靠 EXPLAIN 判斷訪問路徑優劣EXPLAIN 缺失:塊執行順序、一/二階段謂詞、實際耗時。需結合 Visual Explain、db2batch、監控指標綜合判斷
14EDM 池不宜過大防分頁EDM 池適度分頁(擴展存儲)反而優於頻繁重建內部結構,建議配置略大於工作集
15擴展 (Extent) 不影響性能SAN/ESS 緩存掩蓋了部分影響,但擴展分配/回收仍有元數據鎖開銷,大表預分配大擴展可減少爭用
16關係劃分 (Horizontal/Vertical Partitioning) 不用BI/市場分析系統大量使用分區表、物化視圖、列存表實現分區裁剪與列裁剪
17所有包綁定到兩個計劃 (批處理/在線)包粒度綁定支援版本隔離、權限分離、編譯選項差異化,過度合併反而增加綁定衝突
18未提交讀 (UR) 是壞事UR 是高併發唯讀查詢的利器(報表、ETL 掃描),無鎖開銷,只要業務可容忍臟讀即可大膽使用
19無超時/死鎖即無鎖問題鎖等待時間才是核心指標。大量短等待雖不死鎖,但嚴重拖慢響應。需監控 LOCK WAIT TIME 而非僅計數
20ESA 壓縮總是好壓縮換 CPU 換 I/O,CPU 瓶頸時反而降性能。每張表需壓測決定,不可全局開關

調優方法論建議

  1. 指標先行:建立基線(吞吐、延遲、CPU、I/O、鎖等待),而非主觀感受;
  2. 分層定位:SQL → 訪問路徑 → 索引/統計 → 緩衝池/排序堆 → 鎖/日誌 → 硬體/OS;
  3. 變更驗證:單變量變更 + 基準測試(db2batch/JMeter),拒絕「感覺變快了」;
  4. 知識沉澱:建立團隊調優知識庫,記錄每次變更的現象、根因、驗證數據。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved