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

DB2 執行計劃工具全攻略:從 EXPLAIN 表建立到 db2exfmt 圖形化輸出實戰

     編輯:DB2 教學

SQL 效能調優的第一步,是「看懂優化器怎麼想」。DB2 提供完整的執行計劃獲取與分析工具鏈,支援圖形界面(Data Studio / IBM Data Management Console)與純命令列模式(AIX/Linux/Windows 無圖形環境)。本文梳理標準化命令列流程,並解析關鍵輸出欄位含義。

標準化 5 步驟獲取文本執行計劃

  1. 連線目標庫:`db2 connect to `
  2. 建立 EXPLAIN 表(僅首次):
    db2 -tvf $HOME/sqllib/misc/EXPLAIN.DDL
    此腳本建立 `EXPLAIN_INSTANCE`、`EXPLAIN_STATEMENT`、`EXPLAIN_OPERATOR` 等 10 張表,歸屬當前 Schema。
  3. 開啟解釋模式:
    db2 "SET CURRENT EXPLAIN MODE EXPLAIN"
    後續 SQL 僅生成計劃,不實際執行,無鎖、無副作用。
  4. 執行目標 SQL:
    db2 "SELECT COUNT(*) FROM STAFF"
    計劃寫入 EXPLAIN 表,以 `EXPLAIN_TIME`、`EXPLAIN_REQUESTER`、`SOURCE_NAME`、`EXPLAIN_LEVEL` 組合唯一標識。
  5. 關閉解釋模式並格式化輸出:
    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/全包名;輸出檔可直接用文本編輯器分析。

進階用法:EXPLAIN SNAPSHOT 獲取實時執行統計

若需對比「估算」與「實際」,可改用 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_TYPESARGABLE (S) vs Non-SARGABLE (N)關鍵過濾條件為 N,改寫 SQL 或建函數索引
JOIN_METHODNL=Nested Loop, MS=Merge Scan, HS=Hash Join大表 NL Join 通常為災難,檢查連接鍵索引與統計資訊
STREAMING是否管道化傳遞 (Y/N)N 表示中間結果物化,可能溢寫臨時表空間

常見陷阱與避坑

  • 未建 EXPLAIN 表:報 `SQL0219N`,執行步驟 2 即解。
  • 忘記關閉 EXPLAIN MODE:後續所有 `db2` 互動模式 SQL 均不執行,極易誤以為業務跑完。習慣用腳本包裹「開啟→跑 SQL→關閉→格式化」。
  • 權限不足:需 `EXPLAIN` 權限或 `DBADM`/`SQLADM`;只讀帳號可申請 `GRANT EXPLAIN ON DATABASE TO USER `。
  • 動態 SQL 參數標記:`SELECT * FROM T WHERE C = ?` 直接 EXPLAIN 會按預設選擇率估算;生產調優請用 `REOPT ALWAYS` 或實際值重寫。

db2exfmt 輸出範例截圖

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

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