表連線方式概念以及在執行計畫中執行步驟 摘

2021-05-26 23:40:55 字數 1749 閱讀 6318

巢狀迴圈連線(nested loops join)巢狀迴圈連線的最核心特徵就是最先被執行的表的查詢範圍決定著整體的資料處理量,後來反覆執行的連線操作按照隨機方式在執行。在巢狀迴圈連線時,當表中的資料量比較少時比較有效;而當表中的資料量比較大時不僅效率較低,而且所需的代價也比較大。因此,在對資料量比較大的表執行連線時應該嘗試其他連線方式。

巢狀迴圈連線的具體執行步驟:

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

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

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

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

排序合併連線(sort merge join)

主要是為了彌補巢狀迴圈連線的不足,即在連線資料量比較大時,為了縮減巢狀迴圈中的大量隨機讀取,以及連線列不存在索引時,可以替代巢狀迴圈連線。

排序合併連線的最大特徵是在掃瞄的同時執行連線,而不是像巢狀迴圈連線那樣為了執行表連線而需要按隨機方式讀取資料。為了實現表連線,必須先對兩個表中將要執行連線的行進行排序。雖然提高了連線的效率,但由於排序的存在,所以也增加了連線的代價。

在連線條件中主要使用的是like、between、>、>=、<、<=而不是「=」比較運算子的情況下,該方式比巢狀迴圈有效。若使用非「=」比較運算子,則雜湊連線無法被使用。

雜湊連線(hash join)

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

將具有相同雜湊值的資料行集中儲存在相同的空間中,該空間被稱為分割槽(partition),在這些分割槽中必須要進行連線的兩個分割槽稱為分割槽對。實際上,雜湊連線是以分割槽對為物件來執行連線操作的。在連線時,將較小分割槽中的資料行讀入到記憶體中並為其建立臨時雜湊表,然後將雜湊表中的行視為內側迴圈,較大分割槽中的行視為外側迴圈來執行雜湊連線。

因為雜湊連線使用的是雜湊的概念,所以在連線條件中也存在著限制條件,即只有在使用了「=」比較運算子的情況下才可以按照雜湊連線方式實現連線。雜湊連線的最大優點就是在連線海量資料表或表中的資料儲存比較分散時比較有效。

半連線(semi join)

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

笛卡爾連線

笛卡爾連線是指兩表連線沒有任何連線條件的情況。這裡的「沒有連線條件」並不是指連一般的查詢條件都沒有,連線條件與查詢條件之間並沒有什麼本質聯絡。從廣義概念上看,笛卡爾連線是m:n的連線。雖然在執行計畫中以「cartesian」來表示笛卡爾連線,但實際上它是按照排序合併方式執行的。

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

ubuntu 中如何檢視正在執行的程序以及結束程序

常用的有關程序檢視的命令 1,ps aux 檢視某個使用者執行的程序 ps u username grep eclipse 檢視使用者名為 username 的使用者是否執行了eclipse 結束正在執行的eclipse kill 為eclipse的pid 號 2,檢視執行中系統的動態實時檢視 to...

SQL調優之三 執行計畫的連線方式

連線是指在sql的where或者from後面跟著多個行源 表,檢視,或者資料集等 的時候,資料庫對這些行源進行聯合的操作。連線的條件則是資料庫要來判斷不同資料集之間關係的依據,如果沒有提供正確的關聯關係,那麼資料庫就會對資料集做笛卡爾連線,把內錶 n行 和外表 m行 的每一行資料進行匹配,結果集是n...

Oracle資料庫中的表連線方式及使用場合

nested loop 對於被連線的資料子集較小的情況,nested loop連線是個較好的選擇。nested loop就是掃瞄乙個表,每讀到一條記錄,就根據索引去另乙個表裡面查詢,沒有索引一般就不會是 nested loops。一般在nested loop中,驅動表滿足條件結果集不大,被驅動表的連...