DB2 採用成本優化器 (CBO),綜合評估 CPU 成本、I/O 成本、系統目錄統計信息與 SQL 語句本身四大因子,生成最優存取路徑。優化流程:語法校驗 → 依據環境信息生成計劃 → 轉譯為機器指令執行 → 返回/緩存結果。
系統目錄視圖 (SYSCAT.TABLES、SYSCAT.COLUMNS、SYSCAT.INDEXES 等) 記錄了表行數、頁數、列分布、索引聚簇度等關鍵元數據。統計信息過期或缺失會誤導優化器選錯計劃。
必須執行 RUNSTATS 的四大場景:
TABLESAMPLE SYSTEM (20))。REDISTRIBUTE DATABASE PARTITION GROUP 後。推薦命令:RUNSTATS ON TABLE schema.table WITH DISTRIBUTION AND DETAILED INDEXES ALL。生產環境建議結合 REORG → RUNSTATS → REBIND 定時作業。
對於短期內數據量劇變的表(如電信月末匯總表),執行:
ALTER TABLE table_name VOLATILE CARDINALITY
優化器將傾向索引掃描而非全表掃描,無視具體統計值。
REORGCHK UPDATE STATISTICS ON TABLE SYSTEMREORGCHK UPDATE STATISTICS ON TABLE USER耗時較長,安排在業務低峰期。DB2 8.2 引入自動維護 (AUTO_RUNSTATS),但建議關閉 (UPDATE DB CFG USING AUTO_MAINT OFF AUTO_TBL_MAINT OFF AUTO_RUNSTATS OFF),改為手動可控窗口執行。
利用 STATISTICS YES 參數在載入過程中直接生成統計信息,避免額外 RUNSTATS 掃描:
LOAD FROM data.del OF DEL REPLACE INTO target
STATISTICS YES WITH DISTRIBUTION AND DETAILED INDEXES ALL
DB2 8.2+ 支持 STATISTICS USE PROFILE 復用預定義統計模板。
跨環境(開發→生產、生產→測試)保持執行計劃一致:
RUNSTATS ON TABLE schema.table → db2look -d db -t table -m -o stat.sql 生成 UPDATE 統計視圖腳本。db2 -tvf stat.sql 導入統計值。實現零數據移動的計劃一致性複製。
「正確、及時的統計信息是優化器生成最優計劃的基石。」建立常態化統計維護機制,配合 VOLATILE、REORGCHK、LOAD 統計、db2look 等工具組合拳,讓 DB2 執行計劃始終處於最佳狀態。