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")
Native Full Outer Join
时间: 2024-09-27 04:00:25
Native Full Outer Join的相关文章
[20120223]full outer join.txt
full outer join 也就是包括左连接以及右连接,然后去除重复的记录.11g改进了算法,演示如下: SQL> select * from v$version;BANNER--------------------------------------------------------------------------------Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit ProductionPL/S
图解SQL的inner join、left join、right join、full outer join、union、union all的区别
SQL的Join语法有很多,inner join(等值连接) 只返回两个表中联结字段相等的行,left join(左联接) 返回包括左表中的所有记录和右表中联结字段相等的记录,right join(右联接) 返回包括右表中的所有记录和左表中联结字段相等的记录,看到一篇图解文章,非常清楚简洁的说明了使用JOIN操作后的结果集是什么格式. 假设我们有两张表.Table A 是左边的表.Table B 是右边的表.其各有四条记录,其中有两条记录name是相同的,如下所示: A表 id name 1 P
SQL Server的Inner Join及Outer Join
当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer Join 以及其应用. 在一个正规化的数据库环境中, 我们常会碰到这款情形: 所需的资料并不是放在同一个资料表中, 在这个时候, 你就要用到 Join. 当然 Join 如何将不同的数据库的资料结合, 还要看你如何使用它, 一共有四种不同的 Join 的方式, 在这篇文章中我们将为你介绍 Inner Join 及 Outer
hive left outer join的问题
最近BA用户反馈有两句看似很像的语句返回的结果数不一样,比较奇怪,怀疑是不是Hive的Bug Query 1 返回结果数6071 select count(distinct reviewid) as dis_reviewcnt from (select a.reviewid from bi.dpods_dp_reviewreport a left outer join bi.dpods_dp_reviewlog b on a.reviewid=b.reviewid and b.hp_statda
HTAP数据库 PostgreSQL 场景与性能测试之 4 - (OLAP) 大表OUTER JOIN统计查询
标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker 操刀设计,PostgreSQL具备与Oracle类似的功能.性能.架构以及稳定性. PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称. 2017年10月,Pos
PostgreSQL vs Greenplum Hash outer join (hash表的选择)
标签 PostgreSQL , Greenplum , hash outer join , hash table 背景 数据分析.大表JOIN.多表JOIN时,哈希JOIN是比较好的提速手段. hash join会首先扫描其中的一张表(包括需要输出的字段),根据JOIN列生成哈希表.然后扫描另一张表. hash join介绍 https://www.postgresql.org/docs/10/static/planner-optimizer.html the right relation is
Greenplum , HAWQ outer join与motion问题讲解
Greenplum , HAWQ outer join与motion问题讲解 作者 digoal 日期 2016-09-05 标签 PostgreSQL , HAWQ , Greenplum , OUTER JOIN , Motion 背景 Greenplum,HAWQ是分布式的数据库,在建表时,我们可以选择分布列,或者选择随机分布. 多个表做等值JOIN时,如果JOIN列为分布列,则不需要进行数据的重分布. 但是,如果使用的是OUTER JOIN,情况就不一样了,你可能会发现多个表进行oute
SQL Server 2008 R2——使用FULL OUTER JOIN实现多表信息汇总
原文:SQL Server 2008 R2--使用FULL OUTER JOIN实现多表信息汇总 =================================版权声明================================= 版权声明:原创文章 谢绝转载 请通过右侧公告中的"联系邮箱(wlsandwho@foxmail.com)"联系我 勿用于学术性引用. 勿用于商业出版.商业印刷.商业引用以及其他商业用途. 本文不定期修正完善. 本文链接:http://w
sql server Right Outer Join用法
Right Outer Join 运算符返回满足第二个(底端)输入与第一个(顶端)输入的每个匹配行的联接的每行.此外,它还返回第二个输入中在第一个输入中没有匹配行的任何行,即与 NULL 联接.如果 Argument 列内不存在任何联接谓词,则每行都是一个匹配行. 一.联接( join) 通过联接,可以根据各个表之间的逻辑关系从两个或多个表中检索数据.联接表示应如何使用一个表中的数据来选择另一个表中的行. 联接条件通过以下方法定义两个表在查询中的关联方式: 指定每个表中要用于联接的列.典型的联接