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

来源:互联网 发布:ubuntu资源监视器 编辑:程序博客网 时间:2024/06/05 09:58

外连接在分页语句中有些特殊情况是无法优化的

left outer joinleftjoin等价

 

外连接(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 其中A10GB B100MB你让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方式再看驱动表大小


阅读全文
0 0
原创粉丝点击