您的位置:首页 > 数据库 > Oracle

14 外连接(hash join outer)--优化主题系列

2017-10-10 16:57 821 查看
外连接在分页语句中有些特殊情况是无法优化的

left outer join与leftjoin等价

 

外连接(outerjoin)

外连接有三种,leftouter join,right outer join,full outer join。

左外连接,左表就做驱动表,右外连接,右表就做驱动表--在NL的时候 

如果走HASH JOIN没有这个限制

如果SQL是用ORACLE的写法加号的另一边的表做驱动表

 

下面举个例子(基于SCOTT11gR2)

select ename,sal,job,dname,dept.deptno

from emp right outer join dept on emp.deptno=dept.deptno wheredept.deptno in(10,20,40);

上面的SQL与下面的SQL是等价的,只是SQL写法不同

select ename,sal,job,dname,dept.deptno

from emp,dept where dept.deptno=emp.deptno(+) and dept.deptnoin(10,20,40);



select /*+ use_nl(emp,dept) */ ename,sal,job ,dname,dept.deptno

from emp right outer join dept on emp.deptno=dept.deptno wheredept.deptno in(10,20,40);



dept是驱动表对不对试一试让EMP表做驱动表并且走NL

是不是外连接走NL的时候没办法改变驱动表顺序??

leading ordered都没办法更改驱动表顺序??

有left join的时候如果走NL
那么左表就是驱动表 rightjoin的时候右表就是驱动表

 

假如 A LEFTJOIN B
谁是驱动表A返回结果有10W行 B放回结果有100行这个时候咋办??

让它走HASH JOIN试试想让EMP作为驱动表



/*+swap_join_input(emp)*/ 用这个HINT是可以的



这个HINT 还有一个作用就是多个表JOIN的时候能制定哪个表作为驱动表

A JOIN B 其中A表10GB B表100MB
你让A作为驱动表走HASH JOIN是不是很慢??

HASH JOIN 会对驱动表在PGA中进行HASH算法
10GB PGA是放不下的

PGA中一个进程最多才2GB
另外 SORTMERGE JOIN其实也分驱动表

其实所有的join都要分驱动表 NL也是

如果走NL 谁主动约谁谁就在上面

如果走HASH JOIN可以用swap_join_inputs这个HINT
去交换驱动表顺序

 

假设 A JOIN BJOIN C JOIN D
他们都走HASHJOIN
现在要C作为驱动表

提问如果SQL当中有外连接+
该怎么办??

先看JOIN方式再看驱动表大小

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息