Oracle-Shared pool最详细的讲解-带你了解什么是Library cache

什么是Library cache

Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放SQL语句,解析树、执行计划(shared curosr)和PLSQL对象(function,procedure,trigger)的信息,以及这些对象所依赖的table,index,view等对象的信息,Oracle利用hash table结构来解决library cache中快速定位的问题,用并发控制的机构,比如锁机制,来管理大量共享对象的并发访问和修改的问题。hash table就是很多hash bucket组成的数组,hash bucket由library cache object组成,每个library cache object都有一个指针library cache handle,其中的namespace属性表示其指向的对象的类型:比如CRSR(Cursor),TABL(Table),INDX(Index) ,PROD(Procedure),TRIG(Trigger)等等

如何快速找到缓冲区里的SQL语句?(11G以前是library cache lock latch 以后是library cache:mutex)

原理与buffer cache中定位block的方式相同

①将对象信息(比如SQL)通过hash计算,用hash计算的值定位到某个hash bucket中,获得一个 ** shared pool latch**(会因为shared pool大小不合理产生)

②获得一个Library cache latch然后顺序扫描bucket中的library cache handle(如果没有跟发起的SQL一样的handle,就会创建一个新的handle,等待事件:** library cache load lock**

③然后获取Library cache lock,使用handle快速定位对象library cache object ( lock的作用是控制进程间的并发访问)

④通过library cahce object里的data block 指向 data heap(真实数据存放的位置)这时候将访问的数据pin在Library cache handle ** Library cache pin**

在这里插入图片描述

在这里插入图片描述

Library cache handle(句柄)

是对象的一个指针,其中name表示的是库缓存对象句柄所对应的库缓存对象的名称。其中的namespace属性表示其指向的对象的类型:比如CRSR(Cursor),TABL(Table),INDX(Index) ,PROD(Procedure),TRIG(Trigger)等等。Library cache latch的主要作用是在hash bucket中定位handle时使用

在这里插入图片描述

LCO(Library cache object)是handel指向的对象,包含了以下几个部分的内容:

1.dependency table:

指向本对象所依赖的对象,比如:select * from emp这个cursor的对象,依赖emp这个表,这里指向了emp这个表的handle。

2.child table:

指向本对象的子对象,比如某个游标的子游标。子游标是指SQL文本相同,但是SQL的实际含义不同的情况,比如执行的用户不同,执行计划不同,执行的环境不同等等,我们一般称之为SQL的不同版本。一个SQL至少包含一个父游标和一个子游标。

注意:parent cursor和child cursor都是用library cache object handle 存储在Library Cache里的

3.authorization table:

对象的授权信息。

4.type

Library cache object的type,包括:shared cursor,index,table,cluster,view,synonym,sequence,procedure,function,package,table body,package body,trigger等等。

5.data blocks

data block是一个指针,指向了data heap,即存放真实数据的地方,主要包括:diana tree, p-code, source code, shared cursor context area等等

在这里插入图片描述

Library cache中的并发控制:

Oracle利用Library cache lock和Librarycache pin来实现并发控制,Library cache lock是在handle上获取的,而Library cache pin则是在data heap上获取。访问对象时,首先必须获取handle上的lock,然后将访问的数据pin在内存中。lock的作用是控制进程间的并发访问,而pin的作用是保证数据一致性,防止数据在访问时被交换出去。

Library cache lock有三种模式:null,share,exclusive,Library cache pin有两种模式:share,exclusive。下面详细解释在修改和访问对象时,lock和pin的作用:

修改对象:

编译SQL或PLSQL对象,获取该对象(cursor,procedure)handle上exclusive类型的lock,并且持有data heap上exclusive类型的pin,防止其他人读取和修改。同时,在该对象所依赖的对象(table)上,必须持有一个share类型的lock和pin,防止在修改的过程中,被其他进程所修改。

访问对象:

访问SQL或PLSQL对象,获取该对象(cursor,procedure)handle上NULL类型的lock,并且持有data heap上share类型的pin,同时,在其依赖的对象(table)上持有share类型的lock和pin。如果一个procedure依赖另外一个function,那么在被依赖的function上,也需要持有share类型的lock和pin。

NULL类型的lock比较特殊,它只存在于cursor和procedure等只读对象上,它并不起到任何并发控制的作用,它更象是一个trigger,当对象失效时,通知所有访问这个cursor的进程。比如:select * from emp这个SQL,依赖emp表,当emp表发生变化时,cursor上的NULL lock被打破,所有有访问这个cursor的进程都会知道该对象已经失效。

当持有对象的library cache pin时,会在row cache中对相应的对象加锁,就是row cache lock,阻止可能导致数据字典信息混乱的DDL发生。

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值