full (outer) join是用來(lái)全連接兩個(gè)表的語(yǔ)法。即希望將A表和B表關(guān)聯(lián),能夠得到A表中有而B(niǎo)表中沒(méi)有的記錄,或者B表中有而A表中沒(méi)有
full (outer) join是用來(lái)全連接兩個(gè)表的語(yǔ)法。即希望將A表和B表關(guān)聯(lián),能夠得到A表中有而B(niǎo)表中沒(méi)有的記錄,或者B表中有而A表中沒(méi)有的記錄。
如何判斷是否有該記錄,則通過(guò)on子句來(lái)關(guān)聯(lián)。
下面是一個(gè)例子:
SQL> with
2 A as(select 1 a, 2 b from dual),
3 B as(select 2 a, 3 b from dual)
4 select * from A full join B
5 on A.a=B.a
6 /
A B A B
---------- ---------- ---------- ----------
1 2
2 3
了解了以上基本原理后,我們應(yīng)該知道,理論上講,A表和B表的在from子句中的順序是沒(méi)有關(guān)系的,也就是不影響結(jié)果。但是,實(shí)際上,卻出現(xiàn)了這樣的問(wèn)題,下面是對(duì)這種情況的描述:
--------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 12791 | 349K| 82 (3)| 00:00:01 |
| 1 | VIEW | | 12791 | 349K| 82 (3)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
|* 3 | FILTER | | | | | |
|* 4 | HASH JOIN RIGHT OUTER| | 12790 | 1124K| 41 (3)| 00:00:01 |
| 5 | TABLE ACCESS FULL | JXC_RISHARESUM | 1735 | 78075 | 7 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL | JXC_ALLTRADEDAY | 12790 | 562K| 33 (0)| 00:00:01 |
|* 7 | HASH JOIN ANTI | | 1 | 76 | 41 (3)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | JXC_RISHARESUM | 1 | 45 | 7 (0)| 00:00:01 |
| 9 | TABLE ACCESS FULL | JXC_ALLTRADEDAY | 12790 | 387K| 33 (0)| 00:00:01 |
--------------------------------------------------------------------------------------------
從以上執(zhí)行計(jì)劃來(lái)看,在第四步驟,,使用的是hash join rigth outer連接方式。而通過(guò)改變兩表的擺放順序,得到如下的執(zhí)行計(jì)劃:
-----------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1876 | 52528 | 82 (3)| 00:00:01 |
| 1 | VIEW | | 1876 | 52528 | 82 (3)| 00:00:01 |
| 2 | UNION-ALL | | | | | |
|* 3 | FILTER | | | | | |
|* 4 | HASH JOIN OUTER | | 1874 | 164K| 41 (3)| 00:00:01 |
| 5 | TABLE ACCESS FULL| JXC_RISHARESUM | 1735 | 78075 | 7 (0)| 00:00:01 |
| 6 | TABLE ACCESS FULL| JXC_ALLTRADEDAY | 12790 | 562K| 33 (0)| 00:00:01 |
|* 7 | HASH JOIN ANTI | | 2 | 152 | 41 (3)| 00:00:01 |
|* 8 | TABLE ACCESS FULL | JXC_ALLTRADEDAY | 2 | 90 | 33 (0)| 00:00:01 |
| 9 | TABLE ACCESS FULL | JXC_RISHARESUM | 1735 | 53785 | 7 (0)| 00:00:01 |
-----------------------------------------------------------------------------------------
注意,此時(shí),執(zhí)行計(jì)劃中的第四個(gè)步驟,變成了:hash join outer方式。這個(gè)才是我們所期望的方式。那究竟是什么導(dǎo)致了這個(gè)變化呢?查看他們的謂詞連接邏輯:
hash join right outer的:
聲明:本網(wǎng)頁(yè)內(nèi)容旨在傳播知識(shí),若有侵權(quán)等問(wèn)題請(qǐng)及時(shí)與本網(wǎng)聯(lián)系,我們將在第一時(shí)間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com