學習doris過程中看到一篇部落格裡面提到了很多種join。
inner join、full outer join、left join、left semi join、anti join。
nested loop join:巢狀迴圈連線,就是用雙層for迴圈。時間複雜度o(a*b)。
hash join:小表join大表時,掃瞄小表,根據join key把小表存hashtable中,再掃瞄大表去hashtable裡面找,大體思路是這樣。兩張表都只掃瞄一次,時間複雜度o(a+b)。
sort merge join:兩張表分別排序,排好了之後用merge。
shuffle join:兩張表根據join key分發到各個節點,然後在各個節點join。有shuffle。比如mapreduce/hive的常規的join。
broadcast join:小表廣播到大表所在節點。比如hive的mapjoin和sparksql的broadcast hashjoin。沒有shuffle(兩張表的資料在節點間分發、傳輸)。
colocate/local join:就是指多個節點 join 時沒有資料移動和網路傳輸,每個節點只在本地進行 join,能夠本地進行 join 的前提是相同 join key 的資料分布在相同的節點。
commen join:常規的shuffle join
map join:小表存hashtable中,可以通過引數控制
bucket join:適用於分桶表,分桶key是joinkey,並且小表大表桶數成倍數,與mapjoin相比,不用對比小表全量
skewjoin:針對資料傾斜的乙個優化的join
spark core中有join運算元,可以優化為broadcast+map,類似於map join的思想。
sparksql中有hash join和sort merge join
sparksql中的hash join又可以分為broadcast hashjoin和shuffle hash join。broadcast hashjoin就是把小表廣播到大表所在節點。shuffle hash join是大表join大表的時候,先分割槽,再用hashjoin。
sort merge join分為:shuffle分割槽、sort排序和merge合併 幾個階段。
在這幾篇部落格中對每種join有詳細的介紹:
常見的join演算法
大表的join在oltp olap領域很常見。對於使用sql的使用者,不需關心底層資料的儲存格式 join的處理演算法。cbo cost based optimizor 會根據join table的統計資訊,選擇join演算法 多表join還有順序問題。例如join順序的選擇就很講究,pgsql的優...
join演算法原理和優化
資料準備 t1 100行 id 主鍵 a t2 1000行 id 主鍵 a 索引 bindex nested loop join sql select from t1 straight join t2 on t1.a t2.a t1為驅動表,t2為被驅動表 執行流程 1.從表 t1 中讀入一行資料 ...
A 演算法 整理
a 演算法 目錄2.總結 注 本文引自 概念 a 探路搜尋,是指在有障礙物的時候,尋找到達目的地最短路徑的搜尋。先介紹一些前置知識助於自己理解a 啟發式搜尋 這是對每乙個搜尋位置進行評估,得到好的位置,再從這個位置進行搜尋直到目標。這樣子好處是 剪枝,效率更高。啟發式搜尋的關鍵是如何進行估價。估價函...