父游标 子游标和软硬解析记载-02

继续整理关于父游标 子游标和软硬解析的东东.根据前篇bloghttp://dotaddjj.itpub.net/post/43172/525234的关于父子游标的整理,这里再次补充一下。父游标和v$sqlarea信息相关联,而子游标和v$sql信息相关联。

Shared cursor

而共享游标shared cursor是在sql语句在游标解析阶段生成获得,位于library cache中的sql语句或匿名的pl/sql块,如果library cache的父游标和子游标能够被共享,此时则为共享游标。父游标能够共享则为共享父游标,子游标共享则是共享的子游标。

Session cursor

Oraclesession分配缓冲区存放sql语句执行结果,用户通过这个缓存区逐条取出记录对其处理,直到记录全部被处理完毕,而session cursor也就是跟session相对应pga的一块内存区域。这里有个视图v$open_cursor视图,每一个打开或解析的sql都存在与该视图中。

Session cursorsql语句的关联:

Session cursoruga分配内存,有其生命周期。首先一个sql语句会在其uga中分配内存区域生成对应的游标并打开; 解析游标(将sql语句与游标关联,并将其执行计划加载到library cache中);定义输出变量(如果游标需要返回数据时);绑定数据变量(如果游标关联的sql语句使用绑定变量);执行与游标关联的sql语句;获取游标返回结果(游标将逐条取出查询的记录直到取完为止);关闭游标(释放uga中该游标占有的相关资源,但library cache中的游标的执行计划按lru原则清除,主要也是为了提供游标共享)

游标的解析:

可以得出任何sql语句相对应的游标都经历了内存分配,创建,打开,解析,执行与关闭几个过程。而其中的游标的解析过程又分为:

1包含vpd的约束条件:如果使用了虚拟私有数据库,并且被解析的SQL语句中引用的某张表激活了它的话,安全策略生成的约束条件就会被添加到WHERE语句中。

(这个vpd的约束条件具体是什么了。)

2语法语义及访问权限检查:

3保存父游标:将游标的文本进行哈希得到哈希值并在library cache寻找相同的哈希值,如不存在则生成父游标保存在library cache中。

4逻辑优化:通过优化手段生成等价意义sql语句,一旦操作完成,则执行计划数量,收缩空间会相应增长(这个收缩空间又是什么了)

5物理优化:为逻辑优化阶段sql语句产生执行计划,读取数据字典中统计信息以及动态统计信息,计算costcbo选择最低的执行计划

6保存子游标:分配内存,将共享子游标存储进去,然后关联父游标和子游标

当只执行前两个步骤时成为软解析吗,否则则为硬解析,而逻辑优化和物理优化非常消耗cpu和资源

父游标里包含的sql文本,首次打开父游标被锁定,直到其他session关闭后游标才被解锁,被锁定的父游标是不能按照lru算法置换出library cache的,只有在解锁以后才能被置换出library cache,同样对应的子游标也随着父游标一起被清除出library cache

子游标包含具体的执行计划,绑定变量,object和权限,优化器设置等,子游标可以被lru算法随时清除出library cache,而oracle可以利用父游标的信息重新构建出一个子游标,这个过程也就是reload

所以与父游标相关的SQL文本,与子游标相关的时执行计划和执行环境。而硬解析通常是由不可共享的父游标导致,而在不使用绑定变量以及动态SQL语句时硬解析就无法避免。

以上的一些定义和总结部参照了ORACLE性能诊断艺术!

[@more@]

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25362835/viewspace-1056500/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25362835/viewspace-1056500/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值