Full Outer Join与left(Right) Outer Join的不同

浏览: 2305

测试步骤如下:

1.创建测试表

SQL> create table t
2 (a varchar2(10),
3 b varchar2(10));
 
Table created
 
SQL>
SQL> create table s
2 (a varchar2(10),
3 b varchar2(10));
 
Table created

 

 

2.测试在left outer情况下,且外部表的有条件限制的执行计划

SQL> explain plan for
2 select t.a,s.*
3 from t left outer join s on (t.a=s.a)
4 where t.a='aa';
 
Explained
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
———————————————————————
Plan hash value: 269431714
———————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
———————————————————————
| 0 | SELECT STATEMENT | | 1 | 21 | 5 (20)| 00:00:01 |
|* 1 | HASH JOIN OUTER | | 1 | 21 | 5 (20)| 00:00:01 |
|* 2 | TABLE ACCESS FULL| T | 1 | 7 | 2 (0)| 00:00:01 |
|* 3 | TABLE ACCESS FULL| S | 1 | 14 | 2 (0)| 00:00:01 |
——————————————————————–
Predicate Information (identified by operation id):
—————————————————
1 – access("T"."A"="S"."A"(+))
2 – filter("T"."A"='aa')
3 – filter("S"."A"(+)='aa')

注意,条件限制filter("T"."A"='aa')和filter("S"."A"(+)='aa')是出现在全表扫描时的。

 

3.如果将上面查询,其它环节都不变,仅仅换成full outer join

SQL> explain plan for
2 select t.a,s.*
3 from t full outer join s on (t.a=s.a)
4 where t.a='aa';
 
Explained
SQL> select * from table(dbms_xplan.display);
 
PLAN_TABLE_OUTPUT
———————————————————————
Plan hash value: 2625355656
———————————————————————
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
———————————————————————
| 0 | SELECT STATEMENT | | 1 | 21 | 5 (20)| 00:00:01
|* 1 | VIEW | VW_FOJ_0 | 1 | 21 | 5 (20)| 00:00:01
|* 2 | HASH JOIN FULL OUTER| | 1 | 21 | 5 (20)| 00:00:01
| 3 | TABLE ACCESS FULL | T | | | 2 (0)| 00:00:01
| 4 | TABLE ACCESS FULL | S | 1 | 14 | 2 (0)| 00:00:01
———————————————————————
Predicate Information (identified by operation id):
—————————————————
1 – filter("T"."A"='aa')
2 – access("T"."A"="S"."A")

 

注意,全表扫描时不再应用filter("T"."A"='aa')的限制条件。

FULL OUTER JOIN的WHERE子句条件会出现在VIEW视图中。

ORACLE会先将FULL OUTER JOIN得出结果(视图),然后从视图应用条件filter("T"."A"='aa')来获得最终结果集。

推荐 0
本文由 newkoa 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册