SQL 語句相同、表結構相同、索引相同,甚至資料量相似,但 EXPLAIN 出來的存取計劃卻截然不同。根因通常隱藏在三大維度的不一致:統計資訊、優化級別、配置參數。本文實戰演示如何用 db2look 精準複製這三重屬性,實現測試環境「像素級」重現生產計劃。
db2look -m:提取統計資訊 (UPDATE 陳述式)db2look -e -a -t <table>:提取 DDL (含索引、約束)db2look -l:提取表空間/容器/緩衝池佈局db2exfmt:格式化 EXPLAIN 輸出UPDATE DB CFG:同步優化級別等關鍵參數
Access Plan:
Total Cost: 25.8843
HSJOIN (Hash Join)
/ \
TBSCAN TBSCAN
Access Plan:
Total Cost: 25.8843
MSJOIN (Merge Scan Join)
/ \
TBSCAN TBSCAN
| 參數 | 生產 (PROD) | 測試 (TEST) | 影響 |
|---|---|---|---|
| DFT_QUERYOPT | 5 | 3 | 優化器搜尋空間大幅縮減,Hash Join 被剪枝 |
| 其他參數 | 完全一致 | 完全一致 | - |
UPDATE DB CFG FOR SAMPLE USING DFT_QUERYOPT 5
db2 terminate
db2 connect to sample
# 重新 EXPLAIN → 獲得相同 Hash Join 計劃
db2 "connect to sample"
db2 "create index name_ind on staff (name,id)"
db2 "runstats on table skapoor.staff with distribution and indexes all"
db2 "set current explain mode explain"
db2 "select name from staff where id=10 order by name"
db2 "set current explain mode no"
Access Plan:
Total Cost: 0.111065
IXSCAN
|
INDEX: SKAPOOR.NAME_IND
# 1. 提取儲存佈局 (表空間、容器、緩衝池)
db2look -d sample -l -o storage.out
# 2. 提取 DDL + 統計資訊 (關鍵 -m 參數)
db2look -d sample -e -a -m -t STAFF -o db2look.out
# -m 產生 RUNSTATS 等價的 UPDATE 陳述式,直接套用至測試庫即可複製統計分佈
storage.out 建立同構儲存佈局db2look.out 建立表、索引、套用統計資訊SYSCAT.INDEXES、SYSCAT.COLUMNS、SYSCAT.COLDIST 統計欄位一致| 類別 | 關鍵參數/物件 | 提取工具 | 驗證方式 |
|---|---|---|---|
| 優化器環境 | DFT_QUERYOPT | db2 get db cfg | UPDATE DB CFG 同步 |
| DB2_SQLROUTINE_PREPOPTS (註冊表) | db2set -all | db2set 同步 | |
| CURRENT EXPLAIN MODE/SNAPSHOT | 應用層設定 | 腳本固化 | |
| 統計資訊 | Table/Index/Column/Distribution | db2look -m | SYSCAT.* 統計視圖全欄位比對 |
| RUNSTATS PROFILE | db2look -m | PROFILE 文本比對 | |
| Statistical Views | db2look -e | VIEW 定義比對 | |
| MQT 刷新狀態 | db2look -e | REFRESH TIME 比對 | |
| 物理佈局 | Tablespace/Container/Page Size | db2look -l | SYSCAT.TABLESPACES/CONTAINERS |
| Bufferpool 定義/大小/頁面 | db2look -l | SYSCAT.BUFFERPOOLS | |
| Partition Map (DPF) | db2look -l | SYSCAT.DBPARTITIONGROUPDEF | |
| 硬體/OS 資源 | CPU 核心數 / 排程器 | OS 命令 | 影響並行度、I/O 平行 |
| 記憶體大小 / Huge Pages | OS 命令 | 影響 SORTHEAP、BP、LOCKLIST |
db2exfmt -d DUMMYDB -g TIC -w -1 -n % -s % -# 0 -o test_dummydb_exfmt.txt
# -g TIC: 圖形化計劃
# -w -1: 寬度自適應
# -n % -s %: 所有節點/所有節
# -# 0: 所有查詢
SELECT TABNAME, COLNAME, COLCARD, NUMNULLS, AVGCOLLEN, HIGH2KEY, LOW2KEY
FROM SYSCAT.COLUMNS WHERE TABSCHEMA='SKAPOOR' AND TABNAME='STAFF';
SELECT * FROM SYSCAT.COLDIST WHERE TABSCHEMA='SKAPOOR' AND TABNAME='STAFF';
-m 統計 → 計劃偏移 90%+ 機率DFT_QUERYOPT、DB2_WORKLOAD、DB2_SQLROUTINE_PREPOPTS 等註冊表變數CPUSPEED 校準或限制資源)優化器是確定性函數:Plan = f(SQL, Schema, Statistics, Config, Hardware)。db2look 提供了前四項的完整序列化能力。掌握 -m 統計遷移、-l 佈局遷移、配置參數逐項對齊 三板斧,配合 db2exfmt 可視化比對,即可在測試環境精準重現生產計劃,實現「上線零驚喜」的 SQL 質量保障體系。