shared pool初学小结

对数据库的访问经常有很多操作是重复的,如何避免重复解析这些命令,降低对系统资源的消耗,就是shared pool的意义。 shared pool主要由free空间、  library cache  和  data dictionary cache组成:

一、sql语句解析的粗略过程
sql语句是一种非过程化的语言,也就是说用户只需简单的将它通过网络传给数据库,剩下的一系列过程都数据库自己完成。在这个过程中,PGA会为用户分配一个server process来处理用户请求,接下来当要解析一条sql语句时,该过程主要分为以下几个方面:
1.首先会检查这条sql语句的语法是否正确;
2.用户所要访问的对象(表或视图之类)是否存在;
3.然后会检查发出这条sql语句的用户是否有访问该对象的权限;
4.如果这些都没问题,server process会把sql语句经过一些操作转换成oracle能识别的特定数字,即生成执行计划;
5.最后选择一条最优的执行方案,作为执行sql语句的执行计划,这一步也是最消耗资源的;

做完这一切之后,server process会把选好的执行计划放到library cache中,这个过程被称为硬解析。与硬解析相对应的是软解析,软解析也会对sql语句进行一些常规检查,但是不会从众多执行方案中选择最优的执行计划,也就是不进行最消耗资源的一步。一般情况下,如果sql语句在library cache能找到对应的执行计划,就会发生软解析,反之,则会进行硬解析。

二、chunk 和 chain
再说说发生硬解析时的情况,当server process带着sql语句进入shared pool的时候,会引出chunk这个概念,shared pool中会把处于free状态下的cache按照从小到大顺序串成一条一条的chain,这些大小不一的cache就被称为chunk。需要解析的sql语句会根据自己需要占用的内存空间从这些chunk组成的chain上选择合适大小的chunk块。这里需要注意的是,如果选择的chunk大于sql语句需要的内存块,那么这个chunk就会被分为两部分,一部分供sql语句使用,另一部分就是剩下的小chunk会再次被挂到对应大小的chain上。这里有一个潜在的问题,如果oracle发生大量的硬解析,就会产生茫茫多的小chunk,如果此时需要执行一条很大的sql语句,server process无法在chain上找到合适大小的chunk,就会出现oracle很经典的ORA-4031错误,即使此时shared pool中的free memory还有很多空间。

通常来说,oracle会使用大量的chain把cache按照功能、特性或者大小的因素串起来,chain具有遍历性,就是可以从头到尾对chain上的cache进行查找。

三、data dictionary cache
data dictionary cache中存放了 oracle数据库自身的数据信息 当每次发生解析时,对sql语句中要访问对象的存在与否和访问者权限信息等的验证都要通过 data dictionary cache来完成,因此它的存在也是非常有意义的。

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

转载于:http://blog.itpub.net/29602308/viewspace-1143072/

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值