对Oracle软软解析的一点看法

  • 时间:
  • 浏览:0
  • 来源:uu快3大小_uu快3网站_开奖历史

private sql

 固定每段:绑定信息,数据价值形式信息,指针。随session的创建而创建,开使英文而释放

 动态每段:执行sql的中间结果集,如多表联查,排序。随sql的创建而创建,开使英文而释放

接下来聊下PGA的组成。

1.PGA=UGA + CGA

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

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

session cursor cache hits

 在session cursor cache找到的次数。在session中每处于一次硬硬解析,就代表session cursor cache的一次命中。

 如此前面说的session cursor对应UGA中private sql区的动态每段,当执行SQL语句的然后创建,主要用于作为SQL中间结果集的缓存区域,而且当另1个SQL在同另1个会话中连续执行三次以上时,你这俩cursor会被缓存,当相同SQL再次执行时,直接使用你这俩打开的游标。

session cursor cache count

 你这俩数值指的是当都不话缓存的的你这俩sql cursor的总数量

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

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

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

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

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

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

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

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

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

1.查找PGA的private sql area,若命中,处于硬硬解析,若不命中进行步骤2;

2.在Library Cache中匹配该SQL的hash值,若命中处于软解析,而且进入步骤3;

3.处于硬解析,机会执行递归查询获取统计信息,而且用来计算执行开销,而且生成执行计划,并将执行计划缓处于Library Cache中。

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

 如此硬硬解析呢?正如前面所说,当session cursor被缓存时,下一次在同一会话执行同另1个SQL的然后就还还要直接使用你这俩打开的游标,你这俩过程然后硬硬解析。硬硬解析相对比软解析,甚至还省去了步骤1和2,而且还减少了打开游标的开销。

 直接使用你这俩还未关闭的游标,导致 分析提交你这俩SQL请求然后,接下来就还还要直接去获取执行计划执行该SQL了,而软解析在命中执行计划然后还还要经历SQL hash查找的过程。

 首先了解下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的区别。

user session(会话信息区)

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

 在接触过oracle优化器的价值形式然后,大家都知道oracle优化器的另1个迷人之处,就在于shared pool的设计,说准确点是shared pool中的Library Cache,你这俩设计的结果然后让执行计划变得可缓存。而且产生了软解析的概念,这就保证了相同SQL在统计信息不处于变化的前提下只用经历一次比较复杂的解析过程。而相对比软解析,oracle优化器还有并不是更为特殊的行为,即硬硬解析,处于硬硬解析过程的SQL将消耗更小的开销,执行更加飞快。

还还要查询相关视图查看某会话中处于硬硬解析的状态,如下