Simple Nested-Loop Join:SNLJ凌受,簡(jiǎn)單嵌套循環(huán)連接
Simple Nested-Loops Join算法相當(dāng)簡(jiǎn)單身冀、直接默辨。即外表(驅(qū)動(dòng)表)中的每一條記錄與內(nèi)表(被驅(qū)動(dòng)表)中的記錄進(jìn)行比較判斷(就是個(gè)笛卡爾積)沽翔。對(duì)于兩表聯(lián)接來說锄俄,驅(qū)動(dòng)表只會(huì)被訪問一遍技竟,但被驅(qū)動(dòng)表卻要被訪問到好多遍
冰肴,被驅(qū)動(dòng)表的具體訪問次數(shù)取決于對(duì)驅(qū)動(dòng)表執(zhí)行單表查詢后的結(jié)果集中的記錄條數(shù)。
用偽代碼表示一下這個(gè)過程就是這樣:
For each row r in R do -- 掃描R表(驅(qū)動(dòng)表)
For each row s in S do -- 掃描S表(被驅(qū)動(dòng)表)
If r and s satisfy the join condition -- 如果r和s滿足join條件
Then output the tuple <r, s> -- 返回結(jié)果集
其中R表為外部表(Outer Table),S表為內(nèi)部表(Inner Table)熙尉。這是一個(gè)最簡(jiǎn)單的算法联逻,這個(gè)算法的開銷其實(shí)非常大。假設(shè)在兩張表R和S上進(jìn)行聯(lián)接的列都不含有索引检痰,外表的記錄數(shù)為RN包归,內(nèi)表的記錄數(shù)位SN。根據(jù)上一節(jié)對(duì)于Join算法的評(píng)判標(biāo)準(zhǔn)來看铅歼,SNLJ的開銷如下表所示:
可以看到讀取記錄數(shù)的成本和比較次數(shù)的成本都是SN*RN公壤。假設(shè)外表內(nèi)表都是1萬條記錄,那么其讀取的記錄數(shù)量和Join的比較次數(shù)都需要上億椎椰。實(shí)際上數(shù)據(jù)庫并不會(huì)使用到SNLJ算法厦幅,而是會(huì)去使用BNJL算法,因?yàn)镾NLJ實(shí)在是太慢慨飘!