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

深入解析 DB2 優化器對 JOIN 語句的基數估計機制

     編輯:DB2 教學

前言:優化器的核心角色

在 DB2 資料庫系統中,優化器堪稱「心臟與靈魂」,如同高性能引擎般分析 SQL 語句,並依據成本模型選擇最優存取路徑。其核心任務在於精準估算各執行步驟的結果集大小——即所謂的基數估計。而在所有 SQL 估計場景中,JOIN 操作的計算最為複雜,也是效能調校的關鍵戰場。

核心概念:選擇率與基數

優化器引入兩大關鍵指標:

  • Selectivity(選擇率):謂詞過濾後的結果集佔原始集合的比例。
  • Cardinality(基數):操作輸出的實際行數。

優化器利用統計資訊,在套用謂詞或執行聚合後,推算中間結果集大小,進而為各存取路徑打分排序。

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,取決於優化等級、參數設定與成本估算。

JOIN 選擇率計算公式與假設

DB2 採用經典公式估算 JOIN 選擇率:

Selectivity(T1.y = T2.y) = 1 / max(colcard(T1.joincol), colcard(T2.joincol))

其中 colcard 為連接欄位的不重複值個數。此公式建立在兩大假設之上:

  1. 包含性假設:一方連接欄的所有值均包含於另一方的取值範圍內。
  2. 均勻性假設:兩連接欄的資料分布均勻。

JOIN 基數估計完整公式

最終 JOIN 基數由三因子相乘得出:

Join Cardinality = Join Selectivity × filtered_cardinality(T1) × filtered_cardinality(T2)

此處 filtered_cardinality 為套用本地謂詞後的各表輸出行數。優化器透過此機制,在保持統計資訊準確的前提下,為複雜多表連接提供可靠的成本評估基礎。

總結

掌握 DB2 優化器對 JOIN 的基數估計邏輯,有助於 DBA 解讀執行計畫、識別估算偏差,並透過更新統計、調整優化等級或改寫 SQL 來引導優化器生成更優計畫。

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