DB2 優化器屬於基於成本的優化器(Cost Based Optimizer, CBO)。它不關心「如何查」,只關心「查什麼」。優化器通過查詢成本公式,綜合評估四大因素為每條可能的訪問路徑打分:
系統目錄視圖中的統計信息直接決定優化器決策質量,主要包括:
| 對象 | 關鍵統計項 | 相關系統視圖 |
|---|---|---|
| 表 | 行數、頁數、PCTFREE、壓縮狀態 | SYSSTAT.TABLES, SYSCAT.TABLES |
| 列 | 數量、長度、值分佈、壓縮 | SYSSTAT.COLUMNS, SYSCAT.COLUMNS |
| 索引 | 是否存在、層級/葉頁數、離散值、是否聚簇 | SYSSTAT.INDEXES, SYSCAT.INDEXES |
此外還有分區/節點組、表空間等信息。
RUNSTATS 是收集統計信息的核心命令,以下四大場景不可或缺:
許多開發者創建索引後發現執行計劃未變,原因正是缺少統計信息。DB2 8.2+ 支持創建索引時同步更新統計,舊版本必須手動跑 RUNSTATS。
REORG 會改變高水位線、頁密度等物理存儲特徵,必須跟進 RUNSTATS 更新統計。
大批量增刪改後統計信息失真。對超大表(如數據倉庫事實表),DB2 8.1+ 支持 TABLESAMPLE SYSTEM (20) 抽樣統計,前提是數據分佈均勻。
分區數據庫重新分布數據後,統計信息必須重收集。
對表 DB2INST1.STAFF 及其所有索引收集詳細統計(含分佈):
db2 runstats on table db2inst1.staff
with distribution and detailed indexes all
生產環境建議建立定時任務,按順序執行:
REORG TABLE 整理物理存儲RUNSTATS 更新統計信息REBIND 讓靜態 SQL 包基於新統計重新生成計劃針對短時間內數據量劇烈波動的表(如電信月末匯總表),統計信息僅代表某個時間點,極易誤導優化器。可將表標記為 VOLATILE:
ALTER TABLE <表名> VOLATILE CARDINALITY
效果: 優化器將傾向選擇索引掃描而非全表掃描,無論統計信息顯示的基數如何。
IBM 提供 REORGCHK 根據統計公式自動判斷表/索引是否需要重組,可作為維護窗口的決策參考。