Implementing Join

Join 操作一般有三種實現(xiàn)策略

  1. nested loop -- 2層循環(huán) 遍歷 R 和 S 表 (廣泛使用)
  2. sort-merge -- 先對R祥山,S 表進行排序瘦真, 在歸并
  3. hash-based 基于哈希

Nested Loop Join (連接操作最基本的算法)

Using a page-by-page scan of the outer relation.
For each outer page, do a page-by-page scan of the inner relation
選 R,S 中較小的一個 作為 the outer relation, 較大的作為 the inner relation

Result = {}
// 在 R 表中 讀 1 塊 block 進入內(nèi)存 
for each page i in R {
   pageR = getPage(R,i)
// 在 S表中 讀 1 塊block 進入內(nèi)存
   for each page j in S {
      pageS = getPage(S,j)
      for each pair of tuples tR,tS
                       from pageR,pageS {
         if (tR.a == tS.b)
            Result = Result ∪ (tR:tS)
}  }  }

基于塊的嵌套循環(huán)的連接算法就是,每次讀R表中一個block進入內(nèi)存, 就把S表中备籽,所有block依次讀入內(nèi)存進行比較操作, 所以S表一共被讀入了B_R* B_S 次分井。

I/O復(fù)雜度
cost = B_S + B_S * B_R (一般把小的表 作為B_S

內(nèi)存需求:
這種算法的內(nèi)存需求很小车猬, 最低只要 3 block , 2塊分別給R,S作為input, 一塊作為output輸出result.

Block Nested Loop Join

如果 兩個關(guān)系 都不能存入內(nèi)存 B_R < M,B_S < M

image.png

  1. 將 R表 切分為 大小為 N-2( N:memory buffer ) 的若干個子集合 --- ceil(B_R / N-2) 個子集合
  2. 內(nèi)存中 N-2為 B_R, 1 為 B_S, 1 為 output buffer.

Nested Loop join算法內(nèi)存需求很低尺锚,并沒有充分利用內(nèi)存诈唬。
如果能把R,S中較小的一個表完全讀入內(nèi)存缩麸, 那么只要1 個block 遍歷 一遍S表就可以完成join 铸磅, 這也是理論上 R Join S 的最低 I/O 開銷---B_S + B_R, 需要滿足 B_R <= N-2.

如果 B_R > N-2, 我們就依次讀入 N-2 塊 R page, 在 遍歷 S 表, 如此重復(fù)杭朱,一共需要 ceil(B_R/N-2) * B_S 次 讀入 S 表阅仔。
所以總的 I/O 復(fù)雜度為
Cost = B_R + B_S* ceil(B_R/N-2)

內(nèi)存需求:
這里明顯是 內(nèi)存拉滿,減少 buffer 會導(dǎo)致 讀入R 表輪次上升弧械,從而導(dǎo)致 cost 上升八酒。


Index Nested Loop Join

上面 2種算法 有一個問題 , 都要線性的依次讀入整個S表的所有 page 到內(nèi)存與R比較才能防止遺漏刃唐,如果 能在S表上加入索引(稀疏 或者稠密索引), 依靠索引能減少讀入 S表的page 數(shù)量羞迷, 這樣就可以節(jié)省 I/O開銷。

for each tuple r in relation R {
    use index to select tuples
        from S where s.j = r.i
    for each selected tuple s from S {
        add (r,s) to result
}   }

I/O 復(fù)雜度為
Cost = B_R + r_R* Sel_S
Sel_S 表示根據(jù)索引找到與該r_R 記錄相match的r_S 所需要的一次開銷画饥。 比如衔瓮,S表該連接鍵上有個 cluster B+ 樹索引, 在B+樹上檢索出 相應(yīng)的 地址需要2 次操作抖甘, 根據(jù)地址找到對應(yīng)記錄r_S 并與r_R 相比較需要1 次操作热鞍, 那么Sel_S 就等于2+1 = 3.


Sort-merge Join

Sort-merge 算法分2步

  1. 對 R, S 表進行排序 (多路歸并排序)
    Sort_R = ceil(1 + log_{N-1}ceil(b_R/N))
    Sort_S = ceil(1 + log_{N-1}ceil(b_S/N))
    總cost : 2*b_R*Sort_R + 2*b_S*Sort_S

2.兩個排序表的merge
- Best case : b_R + b_S
- Worst case: b_R* b_S


grace hash join

grace hash join 為了保證散列函數(shù)的性能, 對內(nèi)存有最低要求薇宠,即:
N >= max(\sqrt{b_R}, \sqrt{b_S}).

  1. 使用 散列函數(shù) h1 對 R偷办, S 進行分區(qū)。


    Partition phase
  2. 使用散列函數(shù) h2 把R表的所有分區(qū)都映射入內(nèi)存中 澄港,再依次映射S表的每一個分區(qū).


    Probe/join

Cost of grace hash join:

  1. partition relation R : partition[R] = 2 b_R 一讀一寫
  2. partition relation S: partition[S] = 2 b_S 一讀一寫
    3.probe/join : b_S + b_R

總開銷: 3 (b_R + b_S)


hybird hash join


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椒涯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子回梧,更是在濱河造成了極大的恐慌废岂,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件漂辐,死亡現(xiàn)場離奇詭異,居然都是意外死亡棕硫,警方通過查閱死者的電腦和手機髓涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來哈扮,“玉大人纬纪,你說我怎么就攤上這事』猓” “怎么了包各?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長靶庙。 經(jīng)常有香客問我问畅,道長,這世上最難降的妖魔是什么六荒? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任护姆,我火速辦了婚禮,結(jié)果婚禮上掏击,老公的妹妹穿的比我還像新娘卵皂。我一直安慰自己,他們只是感情好砚亭,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布灯变。 她就那樣靜靜地躺著,像睡著了一般捅膘。 火紅的嫁衣襯著肌膚如雪添祸。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天寻仗,我揣著相機與錄音膝捞,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛蔬咬,可吹牛的內(nèi)容都是我干的鲤遥。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼林艘,長吁一口氣:“原來是場噩夢啊……” “哼盖奈!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起狐援,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤钢坦,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后啥酱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體爹凹,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年镶殷,在試婚紗的時候發(fā)現(xiàn)自己被綠了禾酱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡绘趋,死狀恐怖颤陶,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情陷遮,我是刑警寧澤滓走,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站帽馋,受9級特大地震影響搅方,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜绽族,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一腰懂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧项秉,春花似錦绣溜、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至岁诉,卻和暖如春锚沸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背涕癣。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工哗蜈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓距潘,卻偏偏與公主長得像炼列,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子音比,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容

  • --- layout: post title: "如果有人問你關(guān)系型數(shù)據(jù)庫的原理俭尖,叫他看這篇文章(轉(zhuǎn))" date...
    藍墜星閱讀 790評論 0 3
  • 我承認我標(biāo)題黨了稽犁。 相信凡是寫過幾行服務(wù)端代碼的同學(xué)都會回答: "當(dāng)然了解"。但是我這里討論的不是join的語法骚亿,...
    xumingmingv閱讀 6,010評論 0 9
  • 曾經(jīng)已亥,我們演繹無數(shù)輝煌…… 23年前,小天使誕生在無數(shù)人期待的目光中来屠,那時虑椎,藝術(shù)教育尚且處于萌芽狀態(tài),人們對很多新...
    xxt1946閱讀 705評論 0 0
  • 今天的妖,鄭珊的打扮還是一身白衣绣檬。潔凈足陨,純白的打扮嫂粟。 “走快點,怎么你磨磨蹭蹭的墨缘⌒呛纾” 明光并非跟不上步伐,而是對這個女...
    南墻丞士閱讀 291評論 0 4
  • 叫我講話撒嬌卸亮,我不會也辦不到!玩裙!所以只有寫了兼贸,寫來告訴你:我愛你~還是很愛很愛的那種!老大回來了嘛回來了嘛回家了嘛...
    童基宸辰哈閱讀 116評論 0 0