在關係型資料庫中,JOIN 操作是多表查詢的基石。SQL Server 的查詢優化器支援三大核心 JOIN 算法:Nested Loop(嵌套循環)、Sort-Merge(排序合併) 與 Hash Join(哈希聯結)。雖然原理不複雜,但在產品級實現中,優化器往往採用改進的變種(如 Block Nested Loops、Index Nested Loops、Hash Team 等)以榨乾效能。本文將以兩張表 R(M 頁)和 S(N 頁)為模型,深入剖析這三大算法的原型、成本模型與適用場景。
思路直觀:以外層表驅動內層表,逐行比對 JOIN 條件。偽碼如下:
foreach tuple r in R do
foreach tuple s in S do
if r.i == s.j then add to result
M + M×N。O(n × m),通常非瓶頸。關鍵點:外/內層順序對 I/O 影響劇烈。小表做外層、大表有索引做內層效能最佳。
continue)。取決於兩因素:是否預排序 以及 重複值比例。
O(n + m),單掃描即可。O(n log n + m log m + n×m),需兩次排序 + 笛卡爾積。GROUP BY/ORDER BY/CUBE 等排序操作時,可重用排序結果,Merge Join 更具優勢。僅支援等值聯結。哈希函數的確定性與無序性導致無法處理範圍、不等式等非等值條件。
h2 建立記憶體哈希表,同鍵值以鏈表形成桶。r 計算哈希定位桶,若桶非空則逐行比對 r.i == s.j 輸出結果。O(m + n × b),b 為桶平均行數。大表每行需遍歷對應桶內所有行,為主要耗時點。tempdb 導致效能暴跌。優化器優先考慮 Nested Loop 與 Sort-Merge;僅當雙表皆大且缺乏合適索引 時才退而求其次選擇 Hash Join。
INNER/OUTER JOIN、INTERSECT、EXCEPT 等集合運算(皆須等值)。產品級優化器對三大算法均有深度改進(如 Batch Mode、Adaptive Join 等),實際執行計畫往往呈現混合形態。分析計畫時,關注 Join Type、Estimated Rows、Memory Grant 及 Spill Warnings,結合統計資料準確度,方能精準判斷優劣、導向最優調優路徑。