oracle 表之間連線型別
排序- - 合併連線 (Sort Merge Join(SMJ))
排序是一個費時,費資源的操作,特別對於大表。基於這個原因,SMJ 經常不是一個特別有效的連線方法,但是如果2 個行源都已經預先排序,則這種連線方法的效率較高。
巢狀迴圈 (Nested Loops(NL))
該連線過程是一個2 層巢狀迴圈,則外層迴圈的次數越少越好,這也就是我們為什麼將小表或返回較小
如果駕駛行源(驅動表或者外部表)比較小,並且在內行源(被驅動表或者被探查表內部表)上有唯一索引,或有高選擇性非唯一索引時,使用這種方法可以。得到較好的效率巢狀迴圈有其它連線方法沒有的的一個優點是:可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料,這可以實現快速的響應時間。
如果不使用並行操作,最好的驅動表是那些應用了where
理論上來說比NL與SMJ更高效,而且只用在CBO優化器中。
雜湊連線 (Hash Join)
較小的row source被用來構建hash table與bitmap,第2個row source
笛卡兒乘積(乘積)
當兩個row source做連線,但是它們之間沒有關聯條件時,就會在兩個row source中做笛卡兒乘積,這通常由編寫程式碼疏漏造成(即程式設計師忘了寫關聯條件)。笛卡爾乘積是一個表的每一行依次與另一個表中的所有行匹配。在特殊情況下我們可以使用笛卡兒乘積,如在星形連線中,除此之外,我們要儘量避免使用笛卡兒乘積。
總結:
在哪種情況下用哪種連線方法比較好:
1.排序 - - 合併連線(Sort Merge Join, SMJ):
對於非等值連線,這種連線方式的效率是比較高的。
如果在關聯的列上都有索引,效果更好。
對將2個較大的row source做連線,該連線方法比NL連線要好些。
但是如果sort merge返回的row source過大,則又會導致使用過 多的rowid在表中查詢資料時,資料庫效能下降,因為過多的I/O。
2.巢狀迴圈(Nested Loops, NL):
如果driving row source(外部表)比較小,並且在inner row source(內部表)上有唯一索引,或有高選擇性非唯一索引時,使用這種方法可以得到較好的效率。
NESTED LOOPS有其它連線方法沒有的的一個優點是:可以先返回已經連線的行,而不必等待所有的連線操作處理完才返回資料,這可以實現快速的響應時間
3.雜湊連線(Hash Join, HJ):
此方法是在oracle7後來引入的,使用了比較先進的連線理論,
其效率應該好於其它2種連線,但是這種連線只能用在
CBO優化器中,而且需要設定合適的hash_area_size引數,才能取得較好的效能。
在2個較大的row source之間連線時會取得相對較好的效率,在一個 row source較小時則能取得更好的效率。
只能用於等值連線中