Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1342409
  • 博文数量: 169
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3800
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc

文章分类

全部博文(169)

文章存档

2024年(24)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2020-09-30 16:32:19

 标量子查询执行计划分析及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) |
给主人留下些什么吧!~~