排序合併 join(sort-merge join)像拉鍊一樣把兩份已排序的清單合併起來。前提是:join 的兩側都必須依 join 述詞排序

索引策略與雜湊 join 相同#

排序合併 join 需要的索引和雜湊 join 一樣:

  • 獨立條件建索引,好一次讀出所有候選記錄。
  • 為 join 述詞建索引沒有用

獨有的優勢:絕對對稱#

不過排序合併 join 有一個獨有的性質:絕對對稱

join 順序毫無差別——連效能上都沒有差別

這對外部 join(outer join)特別有用:其他演算法中,外部 join 的方向(left 或 right)就隱含了 join 順序,排序合併 join 則不受此限。它甚至能同時做 left 與 right 外部 join——也就是 full outer join。

為什麼它仍然罕見#

一旦輸入已排序,排序合併 join 表現非常好;但它很少被使用,因為把兩側都排序的代價極高。雜湊 join 相比之下只需要預處理一側。

排序合併 join 的強項要在輸入本來就已排序時才會顯現——這可以透過利用索引順序、完全避免排序操作來達成。第 6 章「排序與分組」會詳細說明這個概念。

即便如此,在許多情況下雜湊 join 演算法仍然更優