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

Visual Explain 實戰:深度解析 DB2 SQL 存取路徑與連接策略

     編輯:DB2 教學

為什麼需要 Explain

Explain 是性能監控核心組件,揭示 DB2「幕後」如何滿足 SQL 需求:索引使用情況、表訪問順序、鎖需求、基於存取路徑的性能預估。Delphi 使用動態 SQL,存取路徑實時生成,必須定期用 Visual Explain 檢查關鍵語句,發現資源消耗大戶並指導調優。

DB2 存取路徑類型

掃描類

  • 表掃描/表空間掃描:讀取所有頁面,無 WHERE 或優化器判定全掃描更優(如小表、無索引、需大部分數據)。可利用順序預取提前將頁面讀入內存。
  • 索引掃描:
    • 直接索引查找:提供完整索引鍵值,從根頁遍歷至葉子頁定位數據,最快。
    • 匹配索引掃描:提供高順序列值(如索引 (DEPTNO, TYPE, EMPCODE) 中的 DEPTNO, TYPE),遍歷至葉子頁後順序掃描匹配項。
    • 非匹配索引掃描:未提供高順序列值(如只給 TYPE, EMPCODE),從首個葉子頁開始全掃描索引葉子頁。
    • 僅索引訪問:查詢列全在索引中,完全避免讀取數據頁。
  • 多索引訪問:單一存取路徑使用多個索引。AND 謂詞用索引交集,OR 謂詞用索引聯集。

連接方法詳解

多表查詢分解為多個兩兩連接步驟。優化器選擇外表/內表及連接算法:

  • 嵌套循環連接 (NLJ):外表符合行逐行掃描內表(通常用索引)。適合符合行少的場景。
  • 歸並連接 (MJ):雙表按連接鍵排序(利用索引或顯式排序),然後單掃描合併。每表僅掃描一次,適合中大結果集。
  • 散列連接 (HJ):需等值連接謂詞且類型兼容。內表構建內存哈希表(分區存放於排序堆),外表掃描探測。需足夠 sortheap/sheapthres,否則溢出臨時表。優化器傾向小表作內表。

選擇依據:統計信息、表大小、索引可用性、謂詞選擇性、可用內存。無絕對規則,最終由成本估算決定。

優化級別控制搜索策略

級別描述
0最少優化,僅 NLJ 和索引掃描,限制統計信息使用。
1增加 MJ、表掃描、基本查詢重寫。
2非官方文檔常見,介於 1 和 3 間。
3大幅改進,利用所有統計、大多數重寫、列表預取、MQT 路由,貪婪連接枚舉,編譯成本低於 5。
5接近 OS/390 優化,中等資源編譯,動態規劃連接枚舉。
7大量優化,智能判斷動態 SQL 額外資源值不值,混合負載首選。
9類 5 但不智能限制動態 SQL 資源,激進優化。

級別 0、1、2 用貪婪枚舉(確定連接順序後不再變),編譯快但可能非最優;級別 3+ 用動態規劃枚舉,考慮更多備選,編譯慢但質量高。靜態 SQL 在 PREP/BIND 指定,動態 SQL 用 SET CURRENT QUERY OPTIMIZATION。

Visual Explain 實操指南

  1. 準備 Explain 表:運行 sqllib/misc/explain.ddl 創建表。
  2. 啟動工具:Control Center 右鍵數據庫 → "Explain SQL",或獨立運行 db2vexp.exe。
  3. 解讀圖形:樹狀結構,彩色節點代表操作(掃描、連接、排序等)。鼠標懸停/點擊查看參數、統計、成本估算。自下而上閱讀。
  4. 關鍵檢查點:
    • 索引是否用於連接謂詞、本地謂詞、GROUP BY/ORDER BY 避免排序。
    • 連接方法是否合理(如 MJ 是否需額外排序?排序成本可接受?)
    • 內/外表選擇是否最優。
  5. 前提條件:統計信息必須最新,否則 Explain 失真。

文本 Explain 工具

  • db2exfmt:格式化輸出,適合共享。單語句:
    explain all for SQL_stmt\ndb2exfmt -d dbname -g tic -e schema -n % -s % -w -1 -# 0 -o outfile
  • 多語句:文件存放 explain all 語句,db2 -tf file 後同樣 db2exfmt。
  • db2expln:專用於靜態包,db2expln -database dbname -schema schema -package pkg -output out.txt。
  • dynexpln:動態 SQL 文本分析,內部調用 db2expln。

完整性能分析所需信息清單

Explain 僅是拼圖一塊。深度分析還需:原始 SQL、對象 DDL/目錄信息、嵌入 SQL 的應用代碼、當前統計信息、DB2 環境配置(緩衝池、鎖參數)、硬件/OS 環境、執行時並發活動。應用代碼上下文(如循環調用)對性能影響 Explain 無法體現。

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