停止空想

老张的空中之家

library cache lock/pin 概念

作者:admin 发表时间:十二月 - 30 - 2008

转自晶晶小妹  http://space.itpub.net/13095417/viewspace-201617

第一小结  library cache 的内存结构

ITPUB个人空间)K2};z3F wE
Library cache
的作用,最主要的就是存储已解析的SQL声明,避免硬解析。我们可以通过一个视图V$librarycache来了解Library cache点中率,已此来评估SQL声明的解析情况。应时时注意此视图中点中率情况,好及时发现并解决问题。

D[/b;`fd126162 一、Library cache中所存储的信息:
b'e'x(\E)S126162 1. 按对象类型分类:ITPUB个人空间.g0^7`n;s*QL
共享游标(SQL and PL/SQL objects)、数据库对象(tables, indexes, and so on
H;BI Q"bud!Otx-r126162 2. 按存在时间分类:ITPUB个人空间v ~ H| L;Hm McC
存贮对象:如表、索引、视图等(老化后 磁盘上还有 所以叫永久存储 并不是永久存储在LIBRARY 中)ITPUB个人空间.\Ff�j F ?
瞬时对象:如游标(老化后就没有了)(简单了解在Library cache中数据库对象的信息是什么)


*v8SO.w p` {126162 二、Library cache中如何存储信息 ITPUB个人空间QF)xi{ Vz#T%z Ki
了解Library cache的简单原理,对于理解一些调优概念,是十分必要的。 ITPUB个人空间O]+eh s5XEm9U
共享池内存的结构,是计算机中常用的哈希表形式的扩展。常用的哈希表形式,总是先有一个哈希表,保存对象地址(或句柄),然后,根据对象地址(或句柄)访问对象,计算机中常以这种方式组织数据。其基本形式如下:

library

注意地址和句柄的区别,一般来说,地址只是一个位置信息。而句柄,除了位置,还包含一些其他信息。
K,[9E[G+S*N%|^cz4E126162 还要注意“堆(Heap)”的概念,程序开发者在程序员使用系统函数分配的内存。
e8YFl?,vy/j pU126162 注:此处补充一点概念,除了堆之外,还有栈,也是内存中比较常见的名词。开发者在程序中定义的各种变量,就在栈中分配。ITPUB个人空间�_ _J:s/WS
上图每一组哈希值、链表头,叫做一个哈希桶。简单的说就是:哈希桶(Hash Bucket)指向对象句柄(Object Handles),对象句柄存有对象所占的堆内存的地址。由于对象的堆往往不只一个,Oracle习惯称这些堆为子堆。通常,对象句柄中存有0号子堆的地址,而0号子堆中存有其他各个子堆的地址,而Library cache中所存贮对象的信息,就在从0号开始的各个子堆中。ITPUB个人空间eq C1{5U{%?:}\'@

第二小节 Library cachePINLOCK

一、详述Library cache lockLibrary cache pinITPUB个人空间L-C ]iu7v8mk{
1.ITPUB个人空间5Mf/s AZ6ed G9Z
Library cache lock
Library cache pin的模式。
ITPUB个人空间}�G9XxSXI’I
所有在Library cache中的对象,都由两部分组成,一个句柄、至少一个子堆。这一点可以参考上面的图。
u3H)?#e]:_i&?B126162 句柄中记录的有对象的名字、命名空间、Lock的持有者和等待者、Pin的持有者和等待者、一些标志信息,最重要的,句柄中记有堆的地址。
{4N9F:}^N�Ys{126162 Library cache中寻找对象时,先计算HASH值,在HASH表中找到句柄,再经由句柄,找到对象实际的内存地址。在这个过程中,有两个重要的数据项需要被锁保护起来。一个是对象句柄、另一个就是对象的内存堆。在对象句柄上加的锁就是Library cache lock,在内存堆上加的锁,就是Library cache pinITPUB个人空间FG’p)J ue
下面先讨论一下Library cache lock
D#e2?LM(E n6KF126162 1)。 Library cache lockITPUB个人空间d0v+W0^%[}C
Locks 除了阻止不相容的对句柄的访问,以保护句柄中数据的完整性外,获得Locks也是在缓存中定位对象的唯一方式,即:进程在对句柄上加锁的同时,完成在内存中定位堆的操作。
SI0|lyM126162 在句柄上获得Lock、并在内存中定位到堆后,对象可以Pin自己的堆。如果对象相关信息不在内存中,Pinning一个对象将导致它和它的的子堆被装载(此种情况时,如果是多个对象Pin一个对象,将可能会造成Pin等待)ITPUB个人空间.l Z5l;Y _l8T
Lock 有三种模式
q @*n8EU126162 · Share(s) : 读对象ITPUB个人空间o5p?f r7`
· Exclusive(x) : 修改或创建对象ITPUB个人空间OY `'r6k
· Null(n) : 专用于为会话持续
K,gaxWGE126162 注意: 存贮对象可以被锁在以上任意一种方式,瞬时对象只能被锁在Null方式。ITPUB个人空间o:w/C B4Y:C3n
Null 锁在执行SQL声明的解析阶段被获得,此后一直持有。它不阻止任何DDL。也用术语“易碎解析锁”称乎它(breakable parse lock)。
-w W�|/f2hODsB126162 在以下两种情况下Null锁被打碎:ITPUB个人空间PJJ)\ B.o
· 当锁所在对象有一个独占Pin
|S%|o ]%k%Q126162 · 锁所在对象的任何依赖对象有一个独占Pin
.a”j!BG’l;f+Z126162 2)。Library cache pin
o3f8\2gY(ll1k#J126162 Pin有两种模式:ITPUB个人空间l`a _i?
· Share (s) : 读一个对象堆
az1b;sC EO/L126162 · Exclusive (x) : 修改一个对象堆ITPUB个人空间1L/}(d V Z*x
无论存贮对象还是瞬时对象,都能被PinnedShareExclusive模式。当修改对象时,进程首先会以Share模式Pin对象,进行错误和安全检查,然后在以Exclusive模式Pin住对象。Pin的解除将会导致相关对象上的易碎锁Break
A&Qf7Rh*P7y%kd ?126162 不同类型的操作所需要的不同类型的lock/pin
r�O(Q.wX6R[)^/Lw ~126162 1).ITPUB个人空间,iQb0LNr
所有的DDL操作都会在需要处理的对象上放一个Exclusive(排他)类型的LockPin(仅仅当执行的时候加上)
ITPUB个人空间!B-w4A)U I U:]
:重编译,截断表,给对象授权,等等ITPUB个人空间f7hP*l AG
2).ITPUB个人空间k,T,~*YYr
所有对对象的使用都需要一个null类型lockshared类型的pin(仅仅当执行的时候加上)。如:使用视图,执行过程,等等。

QK6y/m Y5B126162 以上规则,也同样应用于对象所有依赖的对象。如:一个依赖于其他视图的视图,一个依赖于其他包的包。
}$R0s9p4I q126162 ITPUB个人空间Pp!fHYEj
下面我们用一个例子,来验证一下Library cache lock/pin
2q+L(yCcXq126162 10:观察Library cache lock/pin 的状态:
2wv3x`h G126162 先建立一下如下过程:
B!V!z \f3gFE+F126162 create or replace procedure jj_cur is
hfd8t7A126162 cursor aa is select kglhdlmd,kglhdpmd ITPUB个人空间N x6U%}-qI
from x$kglob where kglnaobj=’select * from aa_1 where id=1′ and kglhdadr<>kglhdpar;
p:V;I:n b:Z126162 ITPUB个人空间&Hk:V1AQB
kk number:=5;

3N�T-\2j\$M”wD*O126162 ITPUB个人空间!J:{2XNA�Irc#aa
kk1 number:=5;

l9E:t nC*wB*])}y126162
5U8d1ml3o,Z*?�_126162 begin
ITPUB个人空间’_uuj|K
ITPUB个人空间 F5s6L8U’v,y E+u
for i in 1..2000 loop

3R^ l:[*\f126162 ITPUB个人空间 hy |(y4\n:k-k
kk:=5;
ITPUB个人空间 Kb7xY5O9V
ITPUB个人空间[nAc }w
kk1:=5;

M"Uw6v%HO126162
u/Q:o3_2q3[+s_126162 open aa;
ITPUB个人空间l ky]�hD.z+]o

G9\xC6B$W+oF126162 fetch aa into kk,kk1;
ITPUB个人空间[P2b|!^}7XAO

Mh*wq(d_126162 dbms_output.put_line(kk||'-'||kk1);
ITPUB个人空间7] Tnu6U’@`
ITPUB个人空间K,Ns/q/T!q9`
close aa;
ITPUB个人空间$J:}:Q\H+p

d�]j8?#G’PFd7s126162 end loop;
O{’Z0h{QD”X:Dk/M126162

fs!P v?Y126162 ITPUB个人空间!QP F({.x:D
end;

‘Q,_`ame0qx�Q6`8S126162 /ITPUB个人空间.aF5On,|
Kglhdadr是游标句柄,而Kglhdpar是父游标句柄,条件中的kglhdadr<>kglhdpar ,目的是只显示子游标。KglhdlmdLibrary cache lock的模式,为0时表示没有锁,1NULL锁,2是共享锁,3是独占锁。KglhdpmdLibrary cache pin的模式,0是没有Pin2是共享Pin3是独占PinITPUB个人空间 ^V!u�^T|K
另外,我们作为测试用的SQL声明select * from aa_1 where id=1,要保证只有一个子游标,这样做的目的,就是让过程中的游标AA只选出来一条记录。在过程执行完毕后,最好再执行声明:select kglhdlmd,kglhdpmd from x$kglob where kglnaobj=’select * from aa_1 where id=1′ and kglhdadr<>kglhdpar一次,看一下能选出来几行,如果多于一行,说明声明子游标的数量多于一条,应该换一条声明再试。ITPUB个人空间L’JJ%A”L
在会话A中:ITPUB个人空间 s.J,n0Ur*c
spool e:\oracle\aaa.txt
r0AA9g X x:^(e)B�K126162 exec jj_cur;
“L@%Q%Z,l mw-Q126162 在会话B中:
wGKW uQ126162 select * from aa_1 where id=1;
x/]U3?8h4wQ(?0Y126162 在会话A中:ITPUB个人空间$?,[8` da:[Yk/}
spool offITPUB个人空间5{6Gf7P/s:u/@
查看e:\oracle\aaa.txt,可以看到,在会话B的声明执行时:Library cache lock先是1,然后是0。而Library cache pin先是3,后是2,然后是0。会话B中的声明是第一次执行,这是硬解析,所以会有很短时间的独占Pin。上面的例子,可以再试一次,这次,就是软解析了。试验过程同上,结果是,Library cache lock仍是1,然后是0,而Library cache pin则是2,然后是0,不再有3了。

QX-i8_:eB’I126162 ITPUB个人空间$AG�JN iL5B L0e

类别:Oracle

发表评论