标量子查询执行计划分析及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控制。
阅读(3220) | 评论(0) | 转发(0) |