首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> DB2 資料庫 >> DB2 教學

DB2 執行計劃更新機制詳解:RUNSTATS、REORG、LOAD、db2look 四大維度讓優化器「看清」數據

     編輯:DB2 教學

優化器決策鏈路

DB2 採用 基於成本的優化器 (CBO),依據四大輸入評估存取路徑:

  1. CPU 成本
  2. I/O 成本
  3. 系統目錄統計信息 (核心可控因子)
  4. SQL 語句本身

統計信息準確性直接決定計劃優劣。

系統目錄關鍵統計視圖

維度關鍵指標系統視圖
表CARD (行數)、NPAGES、FPAGES、PCTFREE、COMPRESSSYSCAT.TABLES / SYSSTAT.TABLES
欄位COLCARD (離散值)、AVGCOLLEN、HIGH2KEY/LOW2KEY、分佈統計SYSCAT.COLUMNS / SYSSTAT.COLUMNS
索引NLEAF、NLEVELS、FULLKEYCARD、CLUSTERFACTOR、CLUSTERRATIOSYSCAT.INDEXES / SYSSTAT.INDEXES
其他分區組、表空間、節點組信息相關目錄視圖

四大更新統計/計劃手段

1. RUNSTATS + REORGCHK:常規收集與健康檢查

必須 RUNSTATS 的四大場景

  1. 建索引後:V8.2+ 可 CREATE INDEX ... COLLECT STATISTICS 一體化,舊版必跑 RUNSTATS
  2. REORG 後:高水位、頁物理順序變化,統計失效
  3. 數據量變化 10-20%+:增刪改累積達閾值
  4. REDISTRIBUTE 後:分區數據重分佈

標準 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 採樣,前提是數據分佈均勻

VOLATILE 表特殊處理


ALTER TABLE volatile_table VOLATILE CARDINALITY
# 強制優化器傾向索引掃描,忽略統計信息誤導

REORGCHK 自動判斷是否需 REORG


db2 reorgchk update statistics on table system  # 系統表
db2 reorgchk update statistics on table user    # 用戶表
# 大庫耗時長,安排維護窗口

關閉自動維護 (V8.2+)


db2 update db cfg using AUTO_MAINT off AUTO_TBL_MAINT off AUTO_RUNSTATS off
# 手動控制窗口更安心

2. LOAD 統計一體化:載入即收集


# 詳細統計
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

3. db2look:統計信息遷移與計劃凍結利器

場景:開發庫計劃驗證 → 生產庫一致性保障


# 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
# 優化器即刻擁有相同統計視角,生成相同計劃

4. REBIND:讓靜態 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 ... 確認成本下降、存取路徑優化

避坑提醒

  • 統計信息只是「某時刻快照」,高波動表需縮短收集周期或用 VOLATILE
  • REORG 不自動更新統計,必須緊接 RUNSTATS
  • db2look -m 導出的是 UPDATE 語句,目標庫無需重建表即可同步統計
  • 動態 SQL 即時受益,靜態 SQL 必須 REBIND

「統計信息是優化器的眼睛」——保持眼睛清晰、及時聚焦,CBO 才能持續產出最優計劃。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved