1)nested loop
nested loop,指的是兩個表連接配接時, 通過兩層嵌套循環來進行依次的比對, 最後得到傳回結果集的表連接配接方法.select t1.owner,t1.object_name,t2.OBJECT_ID
from test_tab1 t1,
test_tab2 t2
where t1.OBJECT_ID = t2.OBJECT_ID
and ROWNUM

select *
from test_tab1 t1,
test_tab2 t2
where t1.OBJECT_ID > t2.OBJECT_ID
and t1.OBJECT_ID
表t1 作為驅動表,先對表t2 篩選出<8000的資料,再以比對滿足,t1表的> t2.object_id 條件,依次執行。
關于嵌套循環,首先,要確定結果集小的表為驅動表,結果集多的表為被驅動表。這不意味着記錄多的表不能作為驅動表, 隻要通過謂詞條件過濾後得到的結果集比較小,也可以作為驅動表。
其次,在驅動表的謂詞條件列以及被驅動表的連接配接列上加上索引,能夠顯著的提高執行性能。
最後,如果要查詢的列都在索引中,避免回表查詢列資訊時,又将進一步提高執行性能。
2)hash joinselect *
from test_tab1,
test_tab2
where test_tab1.OBJECT_ID = test_tab2.OBJECT_ID
and test_tab1.OBJECT_NAME = 'T_TEST1'
3)sort merge join
Merge Join 是先将關聯表的關聯列各自做排序,然後從各自的排序表中抽取資料,到另一個排序表中做比對。
例如,下面的兩表,滿足篩選條件後,進行排序,特别是對于資料已經是排序的情況下。
select *
from test_tab1 t1,
test_tab2 t2
where t1.OBJECT_ID>t2.OBJECT_ID+10 and t1.OBJECT_ID<300;
/
可以看出對t1和t2表都做了全表掃描,對資料進行了排序,然後對t1 object_id結果集進行了比對和關聯,最後把結果輸出。
4)merge join cartesianselect t1.owner,t2.object_name
from test_tab1 t1,
test_tab2 t2
where t1.OBJECT_ID
上面對t1 表的object_id進行過濾處理後,形成結果集1,這樣的資料可能是排序的,也有可能是不排序的。此後,在對t2表的object_id進行過濾,t1表進行排序,最後吧所有的結果集都進行合并。
關于笛卡爾的參數:alter system set "_optimizer_mjc_enabled" = false;
or
alter session set "_optimizer_mjc_enabled" = false;
5)外連接配接.select t1.owner,t1.object_name,t2.OBJECT_ID
from test_tab1 t1,
test_tab2 t2
where t1.OBJECT_ID = t2.OBJECT_ID(+)
and ROWNUM
不加(+),就變成hash join,這是由于t1 表不需要滿足外連結查詢條件,及完成兩表掃描後,不需要外連結查詢條件,直接傳回到結果集。
可以看到先對表t2 進行了<1000的過濾,在對表t1 <1000,也即是t1 為主表,即使有些記錄關聯不上,主表的資訊都能夠查詢出來。
這個可以通過通路路徑access可以看出"T1"."OBJECT_ID"(+)="T2"."OBJECT_ID"