DB2 優化器是基於成本的專家系統,依據系統目錄統計信息、SQL 文本、CPU/I/O 成本模型生成最優存取路徑。掌握其工作機制並遵循編碼鐵律,能避開 80% 的性能坑。本文覆蓋優化器四步流程、統計信息維護、索引設計原則、三大 SQL 編碼鐵律、應用開發進階技巧。
核心公式:總成本 = CPU 成本 + I/O 成本,權重由統計信息(行數、頁數、離散值分布、索引聚簇度等)決定。
必須保持最新,來源:
收集命令:RUNSTATS(Control Center、批處理、CLP)。生產環境協同 DBA 制定收集策略(負載低峰、大表抽樣等)。
SELECT LASTNAME, SALARY FROM EMP
WHERE EMPNO = '000010' AND DEPTNO = 'D01';
候選索引:EMPNO、DEPTNO、(EMPNO, DEPTNO)。組合索引通常最優——單次索引查找滿足兩個等值謂詞。
WHERE EMPNO=? AND DEPTNO>>? → 索引 (EMPNO, DEPTNO)。(EMPNO, DEPTNO) INCLUDE (LASTNAME, SALARY)),避免回表,大幅降低 I/O。謹慎使用,避免索引膨脹。SELECT LASTNAME FROM EMP WHERE EMPNO=? ✓SELECT * FROM EMP WHERE EMPNO=? ✗SELECT LASTNAME, SALARY FROM EMP WHERE EMPNO='000010'; ✓SELECT EMPNO, LASTNAME, SALARY FROM EMP WHERE EMPNO='000010'; ✗SELECT EMPNO, LASTNAME FROM EMP WHERE SALARY > 50000; ✓WHERE EMPNO = ?。優化器可複用存取計劃,避免重複編譯,顯著提升高頻執行性能。SELECT ... FROM EMP WHERE SALARY > 10000 FETCH FIRST 200 ROWS ONLY;SELECT ... FROM EMP WHERE SALARY > 10000 OPTIMIZE FOR 20 ROWS;SELECT ... FROM EMP WHERE SALARY > 10000 FOR READ ONLY;COMMIT:釋放鎖,避免長事務導致並發超時。修改操作(INSERT/UPDATE/DELETE)後盡快提交。FOR READ ONLY,減少鎖開銷。優化器很強,但不是萬能。統計信息是基石,索引是杠桿,編碼規範是保障。遵循「顯式列、不取已知、下推過濾、參數化、合理分頁、只讀聲明」,配合 COMMIT 節奏控制,即可構建高性能、可維護的 DB2 應用。深入調優還需學習連接策略、子查詢轉換、EXPLAIN 計劃分析等進階技能——從基礎做起,漸進精通。