Native Full Outer Join

简介: Native Full Outer Join是11g的特性,采用此特性,FULL JOIN时只需要对基表做一次扫描。而在Oracle 10g中,缺省FULL JOIN(等同于:FULL OUTER JOIN)时需要对基表做两次扫描,理论上来说性能提升了一倍。
Native Full Outer Join是11g的特性,采用此特性,FULL JOIN时只需要对基表做一次扫描。而在Oracle 10g中,缺省FULL JOIN(等同于:FULL OUTER JOIN)时需要对基表做两次扫描,理论上来说性能提升了一倍。实际上,在10.2.0.3以上版本中也可以使用Native Full Outer Join,但缺省不使用此特性,除非采用以下方式:
1)使用HINT:NATIVE_FULL_OUTER_JOIN
2)将参数“_optimizer_native_full_outer_join”改成force
    ALTER SESSION SET "_optimizer_native_full_outer_join" = force;
    在Oracle的官方文档中,建议从10.2.0.4版本开始,直接从system级别设置此参数为force。
实验:
SELECT COUNT(1) FROM test_pk02 a full join test_pk03 b on a.object_id = b.object_id;
版本10.2.0.5的执行计划:
-------------------------------------------------------------------------------------------
| Id  | Operation             | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
-------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT      |           |       |       |       |   876 (100)|          |
|   1 |  SORT AGGREGATE       |           |     1 |       |       |            |          |
|   2 |   VIEW                |           |   108K|       |       |   876   (2)| 00:00:11 |
|   3 |    UNION-ALL          |           |       |       |       |            |          |
|*  4 |     HASH JOIN OUTER   |           |   107K|  1051K|  1792K|   438   (2)| 00:00:06 |
|   5 |      TABLE ACCESS FULL| TEST_PK02 |   107K|   525K|       |   131   (2)| 00:00:02 |
|   6 |      TABLE ACCESS FULL| TEST_PK03 |   107K|   525K|       |   131   (2)| 00:00:02 |
|*  7 |     HASH JOIN ANTI    |           |   471 |  4710 |  1792K|   438   (2)| 00:00:06 |
|   8 |      TABLE ACCESS FULL| TEST_PK03 |   107K|   525K|       |   131   (2)| 00:00:02 |
|   9 |      TABLE ACCESS FULL| TEST_PK02 |   107K|   525K|       |   131   (2)| 00:00:02 |
-------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   4 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
   7 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
版本11.2.0.4的执行计划:
------------------------------------------------------------------------------------
| Id  | Operation              | Name      | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |           |       |       |   172 (100)|          |
|   1 |  SORT AGGREGATE        |           |     1 |       |            |          |
|   2 |   VIEW                 | VW_FOJ_0  | 50598 |       |   172   (2)| 00:00:03 |
|*  3 |    HASH JOIN FULL OUTER|           | 50598 |   494K|   172   (2)| 00:00:03 |
|   4 |     TABLE ACCESS FULL  | TEST_PK02 | 50598 |   247K|    86   (2)| 00:00:02 |
|   5 |     TABLE ACCESS FULL  | TEST_PK03 | 50598 |   247K|    86   (2)| 00:00:02 |
------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
在10.2.0.5中使用Hint:
SELECT /*+ NATIVE_FULL_OUTER_JOIN test34 */ COUNT(1) FROM test_pk02 a full  join test_pk03 b on a.object_id = b.object_id;
--------------------------------------------------------------------------------------------
| Id  | Operation              | Name      | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
--------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT       |           |       |       |       |   438 (100)|          |
|   1 |  SORT AGGREGATE        |           |     1 |       |       |            |          |
|   2 |   VIEW                 | VW_FOJ_0  |   107K|       |       |   438   (2)| 00:00:06 |
|*  3 |    HASH JOIN FULL OUTER|           |   107K|  1051K|  1792K|   438   (2)| 00:00:06 |
|   4 |     TABLE ACCESS FULL  | TEST_PK03 |   107K|   525K|       |   131   (2)| 00:00:02 |
|   5 |     TABLE ACCESS FULL  | TEST_PK02 |   107K|   525K|       |   131   (2)| 00:00:02 |
--------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
   3 - access("A"."OBJECT_ID"="B"."OBJECT_ID")
目录
相关文章
|
3月前
|
SQL Oracle 关系型数据库
Oracle查询优化-left join、right join、inner join、full join和逗号的区别
【1月更文挑战第5天】【1月更文挑战第13篇】实际查询时,多表联查是常规操作,但是连接方式有多种。
74 0
|
6月前
|
SQL
SAP CDS view 里 Inner Join,Left Outer Join 和 Right Outer Join 的区别
SAP CDS view 里 Inner Join,Left Outer Join 和 Right Outer Join 的区别
51 0
|
7月前
|
SQL 开发框架 .NET
linq中left join和inner join的正确用法
linq中left join和inner join的正确用法
|
9月前
|
SQL
SQL外部联合:right outer join、left outer join、full outer join
SQL将外部联合分为了右外部联合(right outer join)、左外部联合(left outer join)、完全外部联合(full outer join)3个类型。
|
10月前
|
关系型数据库 MySQL
inner join 、left join、right join,优先使用inner join
inner join 、left join、right join,优先使用inner join
|
关系型数据库 MySQL
八、inner join 、left join、right join,优先使用inner join
八、inner join 、left join、right join,优先使用inner join
171 0
|
SQL 数据库
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
113 0
SQL中关于Join、Inner Join、Left Join、Right Join、Full Join、On、 Where区别
|
SQL 关系型数据库 MySQL
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
333 0
MySQL - LEFT JOIN、RIGHT JOIN、INNER JOIN、CROSS JOIN、FULL JOIN
Inner Join, Left Outer Join和Association的区别
测试用的CDS视图的源代码,第8行用Inner Join连接TJ02T, 后者存放了所有系统状态的ID和描述。
Inner Join, Left Outer Join和Association的区别
CDS view里inner join, left outer join和association的区别
CDS view里inner join, left outer join和association的区别
109 0
CDS view里inner join, left outer join和association的区别