Nested Loop 進階補充
- Outer Input 行數 = 符合條件的估計行數,非表總行數(統計資訊 + SARG 形式條件可精準評估)
- Inner Input 索引需求:聯結欄位需為索引鍵前導欄位
- 即使符合條件,優化器仍以成本模型比較,可能選擇 Merge/Hash
- 非叢集索引 + 大表 + 高碎片 → Bookmark Lookup 成本高 → 優化器傾向放棄 Nested Loop
2. Merge Join 詳解
核心前提
兩個輸入必須依聯結欄位預先排序。若聯結欄位有索引且排序一致,可直接 Merge;否則需額外 Sort 操作(極耗記憶體/CPU)。
運作邏輯
- 各取一行比對聯結欄位
- 相等 → 輸出結果集
- 不等 → 捨棄較小值那側的行,該側取下一行繼續比對
- 直到任一端結束
多對多情況
若聯結值在兩表皆有多行(A1..An, B1..Bn),需對 A 每行與 B 所有相等行配對。為避免重複讀取 B1..Bn,會將其預讀至記憶體暫存表加速。
效能特徵
- Merge 本身極快,但前置排序極耗資源(大量排序 = 記憶體/CPU 殺手)
- 大表若聯結欄位有叢集索引,Merge Join 往往是最快選項之一
- 優化策略:表結構設計階段規劃好聯結關係與索引,盡量利用索引順序避免 Sort、減少 Bookmark Lookup
選擇時機
- 不滿足 Nested Loop 條件時考慮
- 兩端資料量較大、聯結欄位皆有索引、超出 Nested Loop 範圍
- 資料量過大導致評估成本過高 → 轉評估 Hash Join
強制指定
INNER MERGE JOIN
OPTION (MERGE JOIN)
3. Hash Join 概覽
- 兩輸入:Build Input (Outer) / Probe Input (Inner)
- 亦用於 UNION、GROUP BY 等操作
- 分兩階段:Build 階段建立 Hash Table、Probe 階段探測匹配
- 詳細算法留待下篇