DB2 採用 基於成本的優化器 (CBO),依據四大輸入評估存取路徑:
統計信息準確性直接決定計劃優劣。
| 維度 | 關鍵指標 | 系統視圖 |
|---|---|---|
| 表 | CARD (行數)、NPAGES、FPAGES、PCTFREE、COMPRESS | SYSCAT.TABLES / SYSSTAT.TABLES |
| 欄位 | COLCARD (離散值)、AVGCOLLEN、HIGH2KEY/LOW2KEY、分佈統計 | SYSCAT.COLUMNS / SYSSTAT.COLUMNS |
| 索引 | NLEAF、NLEVELS、FULLKEYCARD、CLUSTERFACTOR、CLUSTERRATIO | SYSCAT.INDEXES / SYSSTAT.INDEXES |
| 其他 | 分區組、表空間、節點組信息 | 相關目錄視圖 |
CREATE INDEX ... COLLECT STATISTICS 一體化,舊版必跑 RUNSTATS
# 全量採樣 (中小表)
db2 runstats on table db2inst1.staff with distribution and detailed indexes all
# 大表採樣 (數倉事實表)
db2 runstats on table big_fact_table with distribution and detailed indexes all tablesample bernoulli (20)
# 或 SYSTEM 採樣,前提是數據分佈均勻
ALTER TABLE volatile_table VOLATILE CARDINALITY
# 強制優化器傾向索引掃描,忽略統計信息誤導
db2 reorgchk update statistics on table system # 系統表
db2 reorgchk update statistics on table user # 用戶表
# 大庫耗時長,安排維護窗口
db2 update db cfg using AUTO_MAINT off AUTO_TBL_MAINT off AUTO_RUNSTATS off
# 手動控制窗口更安心
# 詳細統計
load from mobile_number.del of del replace into mobile
statistics yes with distribution and detailed indexes all
# 簡略統計
load from mobile_number.del of del replace into mobile
statistics yes and indexes all
# V8.2+ 配置文件模式 (預先定義統計策略)
load from mobile_number.del of del replace into mobile
statistics use profile
# 1. 源環境收集統計並導出
db2 runstats on table <schema>.<table>
db2look -d <src_db> -t <table> -m -o statis.sql
# statis.sql 內容:UPDATE SYSSTAT.TABLES SET ...; UPDATE SYSSTAT.COLUMNS SET ...; ...
# 2. 目標環境應用
db2 -tvf statis.sql
# 優化器即刻擁有相同統計視角,生成相同計劃
RUNSTATS/REORG/db2look 更新統計後,靜態 SQL 包不會自動刷新,必須:
db2rbind <db> -l rebind.log all
# 或針對特定包
db2rebind -p <pkgname>
# 1. REORG 物理整理
db2 reorg table <table> allow read access # 或 allow no access
# 2. RUNSTATS 統計刷新
db2 runstats on table <table> with distribution and detailed indexes all
# 3. REBIND 計劃生效
db2rbind <db> -l rebind.log all
# 4. 驗證關鍵 SQL 計劃
db2expln ... 確認成本下降、存取路徑優化
UPDATE 語句,目標庫無需重建表即可同步統計「統計信息是優化器的眼睛」——保持眼睛清晰、及時聚焦,CBO 才能持續產出最優計劃。