在 DB2 資料庫系統中,優化器堪稱「心臟與靈魂」,如同高性能引擎般分析 SQL 語句,並依據成本模型選擇最優存取路徑。其核心任務在於精準估算各執行步驟的結果集大小——即所謂的基數估計。而在所有 SQL 估計場景中,JOIN 操作的計算最為複雜,也是效能調校的關鍵戰場。
優化器引入兩大關鍵指標:
優化器利用統計資訊,在套用謂詞或執行聚合後,推算中間結果集大小,進而為各存取路徑打分排序。
多表連接時,DB2 採取兩兩配對策略:先連兩表產生中間結果,再與下一張表或另一中間結果連接。連接順序直接影響中間結果集膨脹與否,故優化器極力在早期階段壓縮資料量。
典型 JOIN 謂詞形式為 T1.joincol = T2.joincol,實際查詢常伴隨本地謂詞,如:
T1.joincol = T2.joincol AND T1.filter = literal_1 AND T2.filter = literal_2
優化器會先套用本地謂詞過濾兩表,再執行 JOIN,具體採用 Hash Join、Merge Join 或 Nested Loop Join,取決於優化等級、參數設定與成本估算。
DB2 採用經典公式估算 JOIN 選擇率:
Selectivity(T1.y = T2.y) = 1 / max(colcard(T1.joincol), colcard(T2.joincol))
其中 colcard 為連接欄位的不重複值個數。此公式建立在兩大假設之上:
最終 JOIN 基數由三因子相乘得出:
Join Cardinality = Join Selectivity × filtered_cardinality(T1) × filtered_cardinality(T2)
此處 filtered_cardinality 為套用本地謂詞後的各表輸出行數。優化器透過此機制,在保持統計資訊準確的前提下,為複雜多表連接提供可靠的成本評估基礎。
掌握 DB2 優化器對 JOIN 的基數估計邏輯,有助於 DBA 解讀執行計畫、識別估算偏差,並透過更新統計、調整優化等級或改寫 SQL 來引導優化器生成更優計畫。