oracle的表几种连接比较,几种表连接方式的使用场景
1)nested loop
nested loop,指的是兩個表連接時, 通過兩層嵌套循環(huán)來進行依次的匹配, 最后得到返回結(jié)果集的表連接方法.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 作為驅(qū)動表,先對表t2 篩選出<8000的數(shù)據(jù),再以匹配滿足,t1表的> t2.object_id 條件,依次執(zhí)行。
關(guān)于嵌套循環(huán),首先,要確保結(jié)果集小的表為驅(qū)動表,結(jié)果集多的表為被驅(qū)動表。這不意味著記錄多的表不能作為驅(qū)動表, 只要通過謂詞條件過濾后得到的結(jié)果集比較小,也可以作為驅(qū)動表。
其次,在驅(qū)動表的謂詞條件列以及被驅(qū)動表的連接列上加上索引,能夠顯著的提高執(zhí)行性能。
最后,如果要查詢的列都在索引中,避免回表查詢列信息時,又將進一步提高執(zhí)行性能。
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 是先將關(guān)聯(lián)表的關(guān)聯(lián)列各自做排序,然后從各自的排序表中抽取數(shù)據(jù),到另一個排序表中做匹配。
例如,下面的兩表,滿足篩選條件后,進行排序,特別是對于數(shù)據(jù)已經(jīng)是排序的情況下。
select?*
from?test_tab1?t1,
test_tab2?t2
where??t1.OBJECT_ID>t2.OBJECT_ID+10?and?t1.OBJECT_ID<300;
/
可以看出對t1和t2表都做了全表掃描,對數(shù)據(jù)進行了排序,然后對t1 object_id結(jié)果集進行了匹配和關(guān)聯(lián),最后把結(jié)果輸出。
4)merge join cartesianselect?t1.owner,t2.object_name
from?test_tab1?t1,
test_tab2?t2
where?t1.OBJECT_ID?
上面對t1 表的object_id進行過濾處理后,形成結(jié)果集1,這樣的數(shù)據(jù)可能是排序的,也有可能是不排序的。此后,在對t2表的object_id進行過濾,t1表進行排序,最后吧所有的結(jié)果集都進行合并。
關(guān)于笛卡爾的參數(shù):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 表不需要滿足外鏈接查詢條件,及完成兩表掃描后,不需要外鏈接查詢條件,直接返回到結(jié)果集。
可以看到先對表t2 進行了<1000的過濾,在對表t1 <1000,也即是t1 為主表,即使有些記錄關(guān)聯(lián)不上,主表的信息都能夠查詢出來。
這個可以通過訪問路徑access可以看出"T1"."OBJECT_ID"(+)="T2"."OBJECT_ID"
總結(jié)
以上是生活随笔為你收集整理的oracle的表几种连接比较,几种表连接方式的使用场景的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: cmd库的导入Java,在cmd命令窗口
- 下一篇: 安装oracle后在cmd,在WINDO