您的位置:首页 > 数据库 > Oracle

深入理解Oracle中的shared pool与library cache组件及相关等待事件

2014-11-21 11:09 519 查看


传统的’library cache pin’在10.2.0.2之后默认被取代, 此处PIN被Mutex及其ref count取代。 当进程执行游标语句时或者需要PIN,或者需要hard parse一个子游标heap。在版本10.2.0.1中, 使用mutex部分代码替代PIN的功能默认是不激活的,实际上这取决于隐藏参数_KKS_USE_MUTEX_PIN,在10.2.0.2之后_KKS_USE_MUTEX_PIN默认为TRUE。 换而言之在版本10.2中我们还是可以关闭KKS使用MUTEX替代PIN保护CURSOR的,
但是在版本11g中则几乎无法关闭MUTEX。 

share类型的library cache pin相当于cursor:pin S

exclusive类型的library cache pin 相当于cursor:pin X

library cache: mutex X相当于library cache lock 主要作用是在hash
bucket中定位handle时使用

SQL执行步骤:

1、检查是否有打开的游标,如果有,则直接通过游标link到位于PGA的private SQL AREA( private SQL area),执行步骤15。否则,执行步骤2。

2、检查初始化参数SESSION_CACHED_CURSORS是否被设置,如果被设置,则同样可以通过游标指向到位于PGA的私有SQL AREA,转步骤15。否则执行步骤3。

3、检查HOLD_CURSOR以及RELEASE_CURSOR的设置。如果RELEASE_CURSOR=no(默认no),HOLD_CURSOR=yes(默认为no),当ORACLE执行完SQL语句,为private SQL AREA分配的内存空间被保留,cursor和private SQL AREA之间的link也被保留,预编译程序不再使用它,同样可以通过这个指针直接在private SQL AREA获得语句,转步骤15。

这上面的三种情况,实际上都没有作任何parse,都是直接从位于PGA中的private SQL AREA获得语句并直接执行。此为fast parse。

这三种情况都不存在的情况下,oracle转到步骤4执行。

4、创建一个游标。

5、语法检查Syntax Check:检查语法书写是否正确,是否符合SQL Reference Manual中给出的SQL语法。

6、语义分析Semantic Analysis:查找数据字典,检查表、列是否正确,在所要求的对象上获取语法分析锁,使得在语句的语法分析过程中不改变这些对象的定义, 验证为存取所涉及的模式对象所需的权限是否满足。

7、将语句转化成ASCII等效数字码,再通过散列算法得到散列值。

8,找到对应的bucket,获得hash bucket的library cache lock,然后确认是否存在相同的SQL,即相同的LCO.若在获得library cache lock过程中发生争用,

      则等待library cache lock事件.相同的LCO存在时直接跳至第15步执行,此时称为软解析,每当发生sql parsing请求时,oracle会增加

     parse count(total)统计值.

9,如果不存在相同sql,在获得shared pool latch后,从free list(空闲列)上查找合适大小的空闲的Chunk,如果在获得shared pool lock过程中发生争用,则等待

     shared pool latch 或者 latch:shared pool事件。Oracle会一直持有shared pool latch,直到找到chunk为止。

10,若不存在适合大小的空闲Chunk,则查找更大的空闲Chunk后分割使用,分割后剩下的内存区域重新登记到free list。

11,若检索了所有free list也没有找到合适的空闲的Chunk,则检索LRU list.LRU list的Chunk是recreatable,而且是当前不使用的(还没有Pin的)。

12,若在LRU list上检索也不能确保找到合适大小的Chunk,则追加分配共享池内的剩余内存空间。

13,以上过程如果均失败,则发生错误ORA-4031。

14,若找到适当的Chunk,对SQL相应的Handle(Library cache handle)以Exclusive模式获得library cache lock,并创建LCO信息。创建LCO后,library cache lock

    的模式变换为Null模式,将library cache pin以Exclusive模式获得后创建执行计划。3-8步骤为硬解析Hard Parsing,如果发生硬解析,Oracle将增加

    Parse Count(hard)统计值。

15,Oracle对SQL Cursor以Shared模式获得library cache lock和library cache pin.但是执行修改对象信息(DDL)时,对相应的对象所对应的LCO以Exclusive模式

   获得library cache lock和library cache pin。例如:‘alter table xxx add varchar2(10)’,这个语句在执行阶段,对于SQL Cursor自身是以shared模式

   library cache lock,但是对于表xxx所对应的LCO以Exclusive 模式获得,获取library cache lock和library cache pin过程中发生争用,则各自需要等待

   library cache lock事件和library cache pin事件.

16,Oracle对执行结束的SQL Cursor Fetch数据。这个过程就是fetch阶段,在fetch阶段,SQL cursor将library cache lock变换为Null模式,并解除library cache pin.

   Oracle手册上将以Null模式获得的library cache lock称为breakable parse lock.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: