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

資料庫效能優化:JOIN 方法深度解析 (2) — Nested Loop 進階與 Merge Join

     編輯:關於SqlServer

Nested Loop 進階補充

  • Outer Input 行數 = 符合條件的估計行數,非表總行數(統計資訊 + SARG 形式條件可精準評估)
  • Inner Input 索引需求:聯結欄位需為索引鍵前導欄位
  • 即使符合條件,優化器仍以成本模型比較,可能選擇 Merge/Hash
  • 非叢集索引 + 大表 + 高碎片 → Bookmark Lookup 成本高 → 優化器傾向放棄 Nested Loop

2. Merge Join 詳解

核心前提

兩個輸入必須依聯結欄位預先排序。若聯結欄位有索引且排序一致,可直接 Merge;否則需額外 Sort 操作(極耗記憶體/CPU)。

運作邏輯

  1. 各取一行比對聯結欄位
  2. 相等 → 輸出結果集
  3. 不等 → 捨棄較小值那側的行,該側取下一行繼續比對
  4. 直到任一端結束

多對多情況

若聯結值在兩表皆有多行(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 階段探測匹配
  • 詳細算法留待下篇
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved