外连接在分页语句中有些特殊情况是无法优化的
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方式再看驱动表大小