一、連線方式:
巢狀迴圈(nested loops (nl))
(雜湊)雜湊連線(hash join (hj))
(歸併)排序合併連線(sort merge join (smj) )
二、連線說明:
1.oracle一次只能連線兩個表。不管查詢中有多少個表,oracletable)和內部表(inner table)。
在巢狀迴圈連線中,外部表又稱為驅動表(driver table)
偽**中:table_1為驅動表,table_2為內錶
從偽**中可以看出該連線過程就是乙個2層巢狀迴圈,所以外層迴圈的次數越少越好,這也就是我們為什麼將小表或返回較小結果集的表作為驅動表的原因。
nest loop join cost = 從第乙個表取得資料的成本 + 從第乙個表得到結果的基數 х 對第二個表訪問一次的成本
所以巢狀迴圈一般適合於驅動表記錄集比較少(<10000)且內錶有高效索引訪問方式。
使用use_nl(table_1 table_2)可強制cbo 執行巢狀迴圈連線。
驅動表確定:驅動表【select rows from table_1 where colx= 】一般為根據where條件能得到較小結果集的表,而不一定是整個表記錄比較小的表。
2.(雜湊)雜湊連線(hash join (hj)):
hash join一般用於一張小表和一張大表進行join
3.排序合併連線(sort merge join (smj) ):
通常情況下雜湊連線的效果都比排序合併連線要好,然而如果行源已經被排過序,在執行排序合併連線時不需要再排序了,這時排序合併連線的效能會優於雜湊連線。可以使用use_merge(table_1 table_2)來強制使用排序合併連線。
過程:將兩個表排序,然後將排序後兩個表合併。
四、連線方式總結:
1))巢狀迴圈(nest loop):
對於被連線的資料子集較小的情況,巢狀迴圈連線是較好的選擇。在巢狀迴圈中,外表驅動內錶,外表返回的每一行都要在內表中檢索找到它匹配的行,因此整個查詢返回的結果集不能太大(大於10000不合適),要把返回子集較小的表作為外表(驅動表),而且在內表的連線欄位上一定要有索引。
2)雜湊連線(hash join):
雜湊連線是大資料集連線時常用的方式,優化器使用兩個表中較小的表,利用連線鍵在記憶體中建立雜湊表,然後掃瞄較大的表並探測雜湊表,找出與雜湊表匹配的行。
這種方式適用於較小的表完全可以放入記憶體的情況,這樣成本就是訪問兩個表的成本之和。但是在表很大的情況下並不能完全放入記憶體,這時優化器將它分割成若干不同的分割槽,不能放入記憶體的部分就把該分割槽寫入磁碟的臨時段。
雜湊連線只能應用於等值連線(如where a.col3 = b.col4)、非等值連線(where a.col3 > b.col4)、外連線(where a.col3 = b.col4(+))。
3)排序合併連線(sort merge join )
通常情況下雜湊連線的效果都比排序合併連線要好。然而如果行源已經被排過序,在執行排序合併連線時不需要再排序了,這時排序歸併連線的效能會憂於雜湊連線。
五、連線方式應用場景:
1. 雜湊連線只適用於等值連線。
2. 巢狀迴圈是行源連線方式,只適合小量資料連線。
雜湊連線和排序合併連線是集合連線方式,適合大量資料連線。
3. 在等值連線方式下,返回少量記錄(<10000)且內部表在連線列上存在索引,適合巢狀迴圈連線。若返回大量記錄則適合雜湊連線。
4. 在等值連線方式下,兩個行源集合都很大,若連線列是高基數列,則適合雜湊連線,否則適合排序合併連線。
5. 巢狀迴圈連線可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料。而其它兩種連線方式則不行。
6. 排序合併連線的兩個資料集可以並行處理,而巢狀迴圈和雜湊連線不能.
注: 整理自網路
Oracle表連線方式
實用記憶方法 在哪邊,哪邊就是外來鍵,該錶的資料就 少 無 那邊檢索的就是全表資料。oracle 8i,9i 表連線方法。一般的相等連線 select from a,b where a.id b.id 這個就屬於內連線。對於外連線 oracle中可以使用 來表示,9i可以使用left right f...
oracle 表連線方式詳解
在檢視sql執行計畫時,我們會發現表的連線方式有多種,本文對錶的連線方式進行介紹以便更好看懂執行計畫和理解sql執行原理。一 連線方式 巢狀迴圈 nested loops nl 雜湊 雜湊連線 hash join hj 歸併 排序 合併連線 sort merge join smj 二 連線說明 1....
oracle優化之表連線方式
1 表連線型別 nested loops join hash join merge sort join 2 表連線的知識點 表訪問次數 表驅動順序,是否排序,使用限制。nested loops join 驅動表被訪問0次或1次,被驅動表訪問0次或n次,n由驅動表返回的結果集的條數來定。與驅動順序有關...