对oracle的评价,对Oracle软软解析的一点看法

杂谈

在接触过oracle优化器的特征之后,我们都知道oracle优化器的一个迷人之处,就在于shared pool的设计,说准确点是shared pool中的Library Cache,这种设计的结果就是让执行计划变得可缓存。因此产生了软解析的概念,这就保证了相同SQL在统计信息不发生变化的前提下只用经历一次繁杂的解析过程。而相对比软解析,oracle优化器还有一种更为特殊的行为,即软软解析,发生软软解析过程的SQL将消耗更小的开销,执行更加迅速。

Cursor

首先了解下oracle中的两种sql cursor,Shared Cursor 和 Session Cursor。

1.Shared cursor。缓存于SGA的shared pool,Oracle的Shared Cursor分为Parent Cursor(父游标)和Child Cursor(子游标),父游标存储SQL的文本,子游标则存储sql的执行计划。

2.Session Cursor。缓存于PGA的private sql区,在执行SQL时创建,一般SQL执行完毕释放。Session cursor和shared cursor的区别就在于,session cursor是session私有的,这其实也是PGA与SGA的区别。

PGA

接下来聊下PGA的组成。

1.PGA=UGA + CGA

2.CGA。即call global area,包含排序区+散列区+位图合并区

3.UGA=user session + cursor state(private sql区)

user session(会话信息区)

存放用户权限,角色,性能统计等信息。

private sql

固定部分:绑定信息,数据结构信息,指针。随session的创建而创建,结束而释放

动态部分:执行sql的中间结果集,如多表联查,排序。随sql的创建而创建,结束而释放

那么前面说的session cursor对应UGA中private sql区的动态部分,当执行SQL语句的时候创建,主要用于作为SQL中间结果集的缓存区域,但是当一个SQL在同一个会话中连续执行三次以上时,这个cursor会被缓存,当相同SQL再次执行时,直接使用这个打开的游标。

软软解析的意义

首先看下SQL解析的过程,大致可以概括如下。

1.语法、语义及权限检查;

2.查询转换(语句等价转换,又称为逻辑优化);

3.执行递归查询获取统计信息;

4.根据统计信息计算每条执行路径的执行开销

5.选择开销最小的执行路径作为执行计划

在整个解析过程中,步骤3和4是最其本身的性能开销所在,而软解析正是为了节省这两个步骤而设计的(实际上也省去了步骤2)。

那么软软解析呢?正如前面所说,当session cursor被缓存时,下一次在同一会话执行同一个SQL的时候就可以直接使用这个打开的游标,这个过程就是软软解析。软软解析相对比软解析,甚至还省去了步骤1和2,并且还减少了打开游标的开销。

直接使用这个还未关闭的游标,意味着提交这个SQL请求之后,接下来就可以直接去获取执行计划执行该SQL了,而软解析在命中执行计划之前还需要经历SQL hash查找的过程。

可以查询相关视图查看某会话中发生软软解析的情况,如下

87eecb6672aa9857a89c64c2012d811e.png

session cursor cache count

这个数值指的是当前会话缓存的的这种sql cursor的总数量

可通过参数设置单个会话最大可缓存cursor的总数量

6354b6793d8d5de6ddcc22747499e623.png

session cursor cache hits

在session cursor cache找到的次数。在session中每发生一次软软解析,就代表session cursor cache的一次命中。

结语

同样是为了节省解析带来的性能开销,软软解析实质上是软解析的一个特例。

而无论是哪种解析过程,ORACLE在解析和执行目标SQL时,始终会按照如下逻辑生成执行计划。

1.查找PGA的private sql area,若命中,发生软软解析,若不命中进行步骤2;

2.在Library Cache中匹配该SQL的hash值,若命中发生软解析,否则进入步骤3;

3.发生硬解析,将会执行递归查询获取统计信息,并且用来计算执行开销,然后生成执行计划,并将执行计划缓存在Library Cache中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值