表連接方式概念以及在執行計劃中執行步驟[摘]

 嵌套循環連接(Nested Loops Join)

         嵌套循環連接的最核心特徵就是最先被執行的表的查詢範圍決定着整體的數據處理量,後來反覆執行的連接操作按照隨機方式在執行。在嵌套循環連接時,當表中的數據量比較少時比較有效;而當表中的數據量比較大時不僅效率較低,而且所需的代價也比較大。因此,在對數據量比較大的表執行連接時應該嘗試其他連接方式。

         嵌套循環連接的具體執行步驟:

1.優化器決定優先被執行的外側表。這個外側表也被稱爲驅動表,以驅動表查詢範圍中的每一行數據爲基準從內側表中尋找滿足查詢條件的數據行。

2.在從驅動表中讀取滿足某些查詢條件的數據行之後,SQL語句中所使用到的關於該驅動表的所有列都將獲得常量,通過對這些常量和原來就賦予了常量的查詢條件的斟酌,爲下一步執行選擇一個內側表。

3.如果仍然還存在需要按照該方法執行連接的表,則按照與上面相同的方法來決定連接順序。如果連接列上有索引,則會對優化器決定連接順序有重要影響。

4.實際在連接時,需要讀取與外側集合中的每一行數據相對應的內側集合中的所有行。如果可以通過部分範圍處理的方式來處理,則在執行過程中可以臨時中止連接。對於外側循環中的每一個數據行,內側循環中所有滿足條件的數據行都需要被執行。

 

排序合併連接(Sort Merge Join)

         主要是爲了彌補嵌套循環連接的不足,即在連接數據量比較大時,爲了縮減嵌套循環中的大量隨機讀取,以及連接列不存在索引時,可以替代嵌套循環連接。

         排序合併連接的最大特徵是在掃描的同時執行連接,而不是像嵌套循環連接那樣爲了執行表連接而需要按隨機方式讀取數據。爲了實現表連接,必須先對兩個表中將要執行連接的行進行排序。雖然提高了連接的效率,但由於排序的存在,所以也增加了連接的代價。

         在連接條件中主要使用的是LIKE、BETWEEN、>、>=、<、<=而不是“=”比較運算符的情況下,該方式比嵌套循環有效。若使用非“=”比較運算符,則哈希連接無法被使用。

 

哈希連接(Hash Join)

         哈希連接是指通過使用哈希函數的方法來實現表連接的方式。所謂函數,是指爲其提供一個變量值再通過函數運算返回一個值的過程。哈希函數是指提供必要列值再通過哈希函數運算返回行的存儲位置的過程,在哈希聚簇中使用的就是哈希函數。

         將具有相同哈希值的數據行集中存儲在相同的空間中,該空間被稱爲分區(Partition),在這些分區中必須要進行連接的兩個分區稱爲分區對。實際上,哈希連接是以分區對爲對象來執行連接操作的。在連接時,將較小分區中的數據行讀入到內存中併爲其創建臨時哈希表,然後將哈希表中的行視爲內側循環,較大分區中的行視爲外側循環來執行哈希連接。

         因爲哈希連接使用的是哈希的概念,所以在連接條件中也存在着限制條件,即只有在使用了“=”比較運算符的情況下纔可以按照哈希連接方式實現連接。哈希連接的最大優點就是在連接海量數據表或表中的數據存儲比較分散時比較有效。

 

半連接(Semi Join)

         由各種運算符所構成的子查詢與主查詢之間的連接。儘管子查詢的種類有很多,但其都是一種爲實現子查詢之間連接的表連接。

 

笛卡爾連接

         笛卡爾連接是指兩表連接沒有任何連接條件的情況。這裏的“沒有連接條件”並不是指連一般的查詢條件都沒有,連接條件與查詢條件之間並沒有什麼本質聯繫。從廣義概念上看,笛卡爾連接是M:N的連接。雖然在執行計劃中以“CARTESIAN”來表示笛卡爾連接,但實際上它是按照排序合併方式執行的。

         在SQL語句沒有錯誤的前提下,按照該方式進行表連接的情況有兩種:第一,用戶爲了實現特殊的目的而特意使用笛卡爾連接;第二,在連接三個以上的表時由於連接順序設計上的失誤而使得連接條件無法成立。

 

發佈了35 篇原創文章 · 獲贊 9 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章