常見的join演算法

2021-07-23 18:39:52 字數 941 閱讀 9270

大表的join在oltp/olap領域很常見。對於使用sql的使用者,不需關心底層資料的儲存格式、join的處理演算法。

cbo(cost based optimizor)會根據join table的統計資訊,選擇join演算法、多表join還有順序問題。例如join順序的選擇就很講究,pgsql的優化器就就採用了動態規劃、遺傳演算法、啟發式搜尋等比較複雜的技術。對cbo部分,本文不做深究,只討論下幾種常見的join演算法和其變體,及其適用的場景,順便引出join實現過程中需要考慮的技術因素。

基本的jion演算法分為三種

假定有小表r,大表s,r與s做自然連線;

nested loop join:從r中依次取出關係r,以r的連線key值去掃瞄大表s;外層迴圈掃瞄小表,記憶體迴圈掃瞄大表。這是最簡的一種join方式。

sort-merge join:r與s分別按照連線鍵做全排序,然後對兩個順序陣列做歸併,歸併的過程中輸出key值相等的關係。

hash join:將小表r按照key生成乙個記憶體的hash表(buid過程);然後順序掃瞄大表s,掃瞄過程中去查詢上一步生成hash表確定是否滿足等值條件(probe過程)。這是最簡單的****** hash join。

先看nested loop join的改進,

hash join的改進

hybrid hash join:針對grace hash join的一些優化,即記憶體夠用的情況下,r的第乙個分割槽的pation0的hash表和s的partion0,在build過程中保留在記憶體,這樣build過程一結束,不需要要partion0再次從磁碟load到記憶體

hybrid hybird grace join:hive採用的一種hash join的變體,跟簡單的hybrid join不同,針對大記憶體的場景做了很大優化。

補充,

以上這些都是單擊引擎的join演算法。分布式系統的join跟單機join有所區別。 sparksql實現了三種, 參考

join演算法整理

學習doris過程中看到一篇部落格裡面提到了很多種join。inner join full outer join left join left semi join anti join。nested loop join 巢狀迴圈連線,就是用雙層for迴圈。時間複雜度o a b hash join 小表...

Python常見的list用法(join方法)

本文主要介紹在python列表中常見使用的join方法。基本公式 需要在每個元素中間新增的字元 join 目標list,且所有元素都為str型別 返回乙個 新的字串。注意 此方法可以直接跟在return後。應用一 我們分別對元素都為str型別的list進行join操作,如下,a j 1 k sk l...

MySQL常見的7種通用的Join查詢

sql join sql join 用於根據兩個或多個表中的列之間的關係,從這些表中查詢資料。sql語句 select from tablea a inner join tableb b on a.key b.key例如 sql語句 select from tablea a left join ta...