Explain 是性能監控核心組件,揭示 DB2「幕後」如何滿足 SQL 需求:索引使用情況、表訪問順序、鎖需求、基於存取路徑的性能預估。Delphi 使用動態 SQL,存取路徑實時生成,必須定期用 Visual Explain 檢查關鍵語句,發現資源消耗大戶並指導調優。
多表查詢分解為多個兩兩連接步驟。優化器選擇外表/內表及連接算法:
選擇依據:統計信息、表大小、索引可用性、謂詞選擇性、可用內存。無絕對規則,最終由成本估算決定。
| 級別 | 描述 |
|---|---|
| 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。
sqllib/misc/explain.ddl 創建表。db2vexp.exe。db2exfmt:格式化輸出,適合共享。單語句:explain all for SQL_stmt\ndb2exfmt -d dbname -g tic -e schema -n % -s % -w -1 -# 0 -o outfileexplain 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 無法體現。