在檢視sql執行計畫時,我們會發現表的連線方式有多種,本文對錶的連線方式進行介紹以便更好看懂執行計畫和理解sql執行原理。
一、連線方式:
巢狀迴圈(nested loops (nl))
(雜湊)雜湊連線(hash join (hj))
(歸併)排序
合併連線
(sort merge join (smj) )
二、連線說明:
1.oracle一次只能連線兩個表。不管查詢中有多少個表,oracle 在連線中一次僅能操作兩張表。
2.當執行多個表的連線時,優化器從乙個表開始,將它與另乙個表連線;然後將中間結果與下乙個表連線,以此類推,直到處理完所有表為止。
三、表連線詳解:
1.巢狀迴圈(nested loops (nl)):
巢狀迴圈實現機制(偽**):
for r1 in (select rows from table_1 where colx=)
loop
for r2 in (select rows from table_2 that match current row from table_1)
loop
output values from current row of table_1 and current row of table_2;
end loop;
end loop;
這段**由兩個迴圈構成。
巢狀迴圈中的這兩個表通常稱為外部表(outer table)和內部表(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時。
在絕大多數情況下,
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 表連線方式
一 連線方式 巢狀迴圈 nested loops nl 雜湊 雜湊連線 hash join hj 歸併 排序合併連線 sort merge join smj 二 連線說明 1.oracle一次只能連線兩個表。不管查詢中有多少個表,oracletable 和內部表 inner table 在巢狀迴圈連...
ORACLE 表連線詳解
在oracle中,表連線方式主要有 內連線,外連線,自連線 內連線 這是最常用的連線查詢 select from a inner join b on a.id b.id select from a join b on a.id b.id select from a,b where a.id b.id...