标量子查询执行计划分析及12c优化新特性
1. 标量子查询特点及特殊执行计划:
1)标量子查询的计划和普通计划的执行顺序不同,标量子查询虽然在上面,但是它由下面的customers表结果驱动,每行驱动查询一次标量子查询。
2)标量子查询和filter类似,如果是它们引起的性能问题,要关注是否是执行子查询的次数过多导致查询的效率不高。
3)标量子查询和filter类似,它会根据输入和输出构建hash表缓存键值对,已经查询过的键值对直接从缓存中查找,不用再次执行子查询,从而减少子查询的次数达到优化的目的,10g和11g缓存的是255个hash buckets,12c是1024个hash buckets。
如下所示:
从上面可以看出,标量子查询执行计划和普通执行计划不一样,它上面的是被下面的驱动,类似filter,谓词部分有系统绑定变量。
下面探讨下标量子查询特点以及优化方法,对标量子查询的优化首选方式就是改写。
标量子查询特点:子查询执行次数依赖于连接列distinct数目,重复值越多,效率越好
反之,效率差。
从上面执行计划可以看出,虽然驱动的a-rows有108k行,但是因为distinct数目是11,实际上标量子查询只执行11次,由此可以看出,oracle内部构建了缓存存储键值对,从而减少子查询执行次数,达到优化目的。
2. 标量子查询优化方法:
标量子查询的改写:减少标量子查询次数、改为外连接使用join。
1)减少子查询执行次数
2)将标量子查询改为外连接
其中改为外连接也是12c对标量子查询优化的新特性。
3. 12c标量子查询优化新特性
如前面所示,在12c之前,对于scalary subquery是无法unnest的,这样就导致标量子查询的执行次数受驱动表行数的影响,类似filter操作,而且scalary subquery的执行计划和普通执行计划不一样。(其实也就是查询转换改写成outer join)
select
dname,
(select max(b.sal) from scott.emp b
where b.deptno = a.deptno)
from scott.dept a;
|
12c对标量子查询的优化如下:
只对于max,min,avg单个有效(类似max||min等组合的无效),对count、查询列等无效,受参数_optimizer_unnest_scalar_sq控制。
阅读(3032) | 评论(0) | 转发(0) |