full (outer) join是用来全连接两个表的语法。即希望将a表和b表关联,能够得到a表中有而b表中没有的记录,或者b表中有而a表中没有
full (outer) join是用来全连接两个表的语法。即希望将a表和b表关联,能够得到a表中有而b表中没有的记录,或者b表中有而a表中没有的记录。
如何判断是否有该记录,则通过on子句来关联。
下面是一个例子:
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
了解了以上基本原理后,我们应该知道,理论上讲,a表和b表的在from子句中的顺序是没有关系的,也就是不影响结果。但是,实际上,却出现了这样的问题,下面是对这种情况的描述:
--------------------------------------------------------------------------------------------
| 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 |
--------------------------------------------------------------------------------------------
从以上执行计划来看,在第四步骤,,使用的是hash join rigth outer连接方式。而通过改变两表的摆放顺序,得到如下的执行计划:
-----------------------------------------------------------------------------------------
| 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 |
-----------------------------------------------------------------------------------------
注意,此时,执行计划中的第四个步骤,变成了:hash join outer方式。这个才是我们所期望的方式。那究竟是什么导致了这个变化呢?查看他们的谓词连接逻辑:
hash join right outer的: