DB2 基於成本的優化器決策受系統配置、模式、註冊表變量、優化級別、統計信息等多重因素影響。數據動態性使最佳計劃選擇極其複雜。DB2 9 引入優化剖面和統計視圖兩大增強,分別從「直接干預計劃」和「提升基數估算精度」兩個維度解決疑難優化問題。
大多數查詢已調優良好,但少數 SQL 盡力調整索引、統計、參數後仍不達標,且不願/不能修改應用代碼。優化剖面提供非侵入式干預手段。
將目標查詢及指導規則封裝為符合 XML Schema 的優化剖面文檔,包含全局規則(OPTPROFILE 區段)和語句級規則(STATEMENT PROFILE 區段,按 STMTKEY 匹配)。激活剖面後,所有 SQL 嘗試匹配活動剖面,匹配高效低開銷。指導規則覆蓋默認成本模型決策。
SET CURRENT OPTIMIZATION PROFILE = KCHEN.PROF1(會話級)。db2cli.ini 中 CURRENTOPTIMIZATIONPROFILE=KCHEN.PROF1。SET CURRENT OPTIMIZATION PROFILE。CALL SYSPROC.SET_ROUTINE_OPTS('OPTPROFILE KCHEN.PROF1')(V8 FP13+/V9 FP1+)。BIND OPTPROFILE KCHEN.PROF。-bindoptions "OPTPROFILE KCHEN.PROF1",注意需包含隱式 DECLARE CURSOR 子句。驗證:Explain 輸出會顯示剖面名稱與生效指南。無效指南返回 SQL0437W (rc=13)。修改 SYSTOOLS.OPT_PROFILE 表後需 FLUSH OPTIMIZATION PROFILE CACHE。
| 類別 | 示例 | 說明 |
|---|---|---|
| 計劃優化 | 強制使用索引 T1X | 覆蓋優化器選擇的表掃描 |
| 常規優化 | 指定 REOPT ONCE/ALWAYS/NONE | 推遲優化至運行時變量已知 |
| 常規優化 | 指定優化級別 0 | 單語句覆蓋應用級優化級別 |
| 常規優化 | 運行時並行度 ANY | 影響分區內並行執行 |
| 查詢重寫 | IN 列表轉嵌套循環連接 (GENROW) | 值列表放入內存表提升性能 |
| 查詢重寫 | 子查詢轉連接 (SUBQ2JOIN) | 啟用子查詢轉連接重寫規則 |
| 計劃優化 | 指定連接順序 3-4-1-2 | TABLEID 屬性處理多重表引用 |
| 計劃優化 | 客戶案例:MQT 刷新加速 2 倍+ | 強制使用特定索引 I11 訪問 TAB1 |
T1.C1 = T2.C1 時,假設一方值域包含另一方。實際數據常不滿足(如 T2 有 T1 無的值),導致連接基數高估,錯誤隨連接鏈遞增放大。創建視圖物化關鍵連接/謂詞結果,收集其完整統計(含分布),優化器利用這些「真實」統計替代假設推算,實現精準基數估算。步驟:
CREATE VIEW SCHEMA.V1 AS SELECT * FROM T1, T2 WHERE T1.C1 = T2.C1;
ALTER VIEW SCHEMA.V1 ENABLE QUERY OPTIMIZATION;
RUNSTATS ON TABLE SCHEMA.V1 WITH DISTRIBUTION;
ENABLE QUERY OPTIMIZATION:標記視圖統計參與優化。連接 T1.C1=T2.C1 加本地謂詞 T1.C2='B',無統計視圖時基數估算為 1,實際 4 行;啟用統計視圖後優化器獲知真實分布,估算修正為 4,避免錯誤計劃(如錯選 NLJ 而非 HJ)。DPF 與非 DPF 環境均有效。
優化剖面提供「外科手術式」計劃干預,統計視圖從根源修正成本模型輸入。兩者互補:剖面解決個別頑固語句,統計視圖系統性提升整類查詢優化質量。實施前務必透過 Explain 定位問題根因,避免盲目應用。