SQL 效能調優的第一步,是「看懂優化器怎麼想」。DB2 提供完整的執行計劃獲取與分析工具鏈,支援圖形界面(Data Studio / IBM Data Management Console)與純命令列模式(AIX/Linux/Windows 無圖形環境)。本文梳理標準化命令列流程,並解析關鍵輸出欄位含義。
db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL
此腳本建立 `EXPLAIN_INSTANCE`、`EXPLAIN_STATEMENT`、`EXPLAIN_OPERATOR` 等 10 張表,歸屬當前 Schema。db2 "SET CURRENT EXPLAIN MODE EXPLAIN"
後續 SQL 僅生成計劃,不實際執行,無鎖、無副作用。db2 "SELECT COUNT(*) FROM STAFF"
計劃寫入 EXPLAIN 表,以 `EXPLAIN_TIME`、`EXPLAIN_REQUESTER`、`SOURCE_NAME`、`EXPLAIN_LEVEL` 組合唯一標識。db2 "SET CURRENT EXPLAIN MODE NO"
db2exfmt -d -g TIC -w -l -s % -n % -o db2exfmt.out
關鍵參數:`-g TIC` 含總成本/IO/CPU;`-w` 寬輸出避免截斷;`-l` 包含運算子細節;`-s % -n %` 全 Schema/全包名;輸出檔可直接用文本編輯器分析。若需對比「估算」與「實際」,可改用 Snapshot 模式:
db2 "SET CURRENT EXPLAIN MODE EXPLAIN"
db2 "SET CURRENT EXPLAIN SNAPSHOT YES"
-- 執行 SQL(此時會真實跑完)
db2 "SELECT * FROM LARGE_TABLE WHERE COL1 = 'X'"
db2 "SET CURRENT EXPLAIN MODE NO"
db2 "SET CURRENT EXPLAIN SNAPSHOT NO"
db2exfmt -d -g TIC -w -l -s % -n % -o actual_plan.out
輸出將包含 `ACTUAL_ROWS`、`ACTUAL_IO`、`ACTUAL_CPU` 等實測值,是發現統計資訊過期、基數估算偏差的金鑰。
| 欄位 | 含義 | 異常信號 |
|---|---|---|
| TOTAL_COST | 優化器估算總成本(Timerons) | 同一查詢不同計劃成本差 > 10x,需檢查統計資訊 |
| EST_ROWS / ACTUAL_ROWS | 估算/實際輸出行數 | 比值 > 10 或 < 0.1,統計資訊失準或參數窺探失效 |
| ACCESS_TYPE | 存取方式:T=Table Scan, I=Index Scan, R=RID Scan | 大表出現 T,且無過濾條件,檢查索引缺失 |
| PREDICATE_TYPE | SARGABLE (S) vs Non-SARGABLE (N) | 關鍵過濾條件為 N,改寫 SQL 或建函數索引 |
| JOIN_METHOD | NL=Nested Loop, MS=Merge Scan, HS=Hash Join | 大表 NL Join 通常為災難,檢查連接鍵索引與統計資訊 |
| STREAMING | 是否管道化傳遞 (Y/N) | N 表示中間結果物化,可能溢寫臨時表空間 |

結語:`db2exfmt` 是 DB2 DBA 的「聽診器」。建立「每日 Top 10 高耗 SQL 自動 EXPLAIN + 成本基準線比對」機制,能將調優從「事後救火」轉為「趨勢預防」。掌握上述流程與欄位解讀,即可獨立完成 80% 的執行計劃分析工作。