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方式再看驱动表大小
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方式再看驱动表大小
相关文章推荐
- 11 哈希连接(HASH JOIN)--优化主题系列
- 29 超大表与超小表HASH JOIN优化方法--优化主题系列
- 15 半连接(semi-join)--优化主题系列
- 16 反连接(anti-join)--优化主题系列
- 【Oracle优化笔记】哈希连接(HASH JOIN)详解
- Oracle优化器、优化模式、表的连接方式(Hash Join、Nested Loop、Sort Merge Join)
- 12 排序合并连接(SORT MERGE JOIN)--优化主题系列
- MySQL5.7性能优化系列(二)——SQL语句优化(2)——使用 Semi-Join半连接变换优化子查询,派生表和视图
- 28 分析函数优化自连接,减少表访问次数 --优化主题系列
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- oracle 优化小技巧, filter 与 hash join 连接
- 9 join方法--优化主题系列
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- 使用连接(JOIN)来代替子查询(Sub-Queries) mysql优化系列记录
- SQL server 内部实三种类型的物理连接运算:Merge join、Hash join、Nested loop join对比分析
- Oracle表连接操作——Hash Join(哈希连接)
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP
- 多表连接的三种方式详解 HASH JOIN MERGE JOIN NESTED LOOP【2】
- EntityFramework 使用Linq处理内连接(inner join)、外链接(left/right outer join)、多表查询