SQL 層功能改進 - lookupJoin 的最佳化

KaiwuDB發表於2023-03-14


一、傳統 jon 演算法

lo okupJoin 是 join 查詢的一種, 傳統 join 演算法為:


1.  遍歷 A 表,讀取一條資料 r

2.  遍歷 B 表,對於每條資料,與 r 進行 join 操作

3.  重複 1、2 操作,直到 A 表遍歷完所有資料


二、lookupJoin

現有的 lookupJoin 流程為:

1.  遍歷 A 表,讀取一條資料 r

2.  透過 join key 以及資料 r 構造 B 表資料取值範圍

3.  透過構造的取值範圍對 B 表進行讀取操作,將讀取出的資料與 r 進行 join 操作,返回結果


透過這樣的做法,join 可減少對 B 表全表掃描的操作,提升執行效率。但是執行 lookupJoin 操作的前提是在 B 表中存在 join key 的索引,否則無法對 B 表構造取值範圍。


三、分散式 lookupJoin

1.  分散式 lookupJoin 介紹:

以往 KaiwuDB 叢集在執行 lookupJoin 操作時,會提取 A 資料,根據 A 表資料傳送 scan 請求去別的節點讀取資料。這樣會導致大量結果資料集中在 A 表分佈的節點,沒有充分利用多節點並行執行的優勢。


現在,我們將 A 表資料提前透過 hash 重分佈路由到多個節點再並行執行 lookupJoin 操作;這樣不僅可以提高執行效率,還可以使結果集在多個節點按照 hash key 預分佈。


圖 1


2.  分散式 lookupJoin 對分散式執行產生的效果:

分散式 lookupJoin 可以使 join 結果集按照 join 列在節點間呈現 hash 分佈,大大提高了叢集節點算力利用率,減少 hash 重分佈的次數,縮短整體 query 執行時間。


圖 2


如圖 2 所示,在圖 1 的基礎上把 join 結果與 C 表再進行 join 查詢:select * from a,b,c where a.a=b.a and a.a = c.a ,模擬複雜查詢場景。由於在分散式 lookupJoin 查詢後,資料按照 join key 已經在三節點上 hash 分佈了,所以在執行與 C 表的 join 操作時,只需要 hash 重分佈 C 表的資料,減少了 hash 重分佈的次數,提高了執行效率。

3.  分佈表的 lookupJoin:

分佈表是一種特殊表,表中資料按某列的 hash 值分佈在各個節點上,如果分佈表的分佈列與 hash join 列正好一致,在執行分散式 lookupJoin 時可以直接在各個節點並行執行 lookupJoin,省去了 hash 分佈的操作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027415/viewspace-2939595/,如需轉載,請註明出處,否則將追究法律責任。

相關文章