Library cache简介
Library cache最主要的功能就是存放用户提交的SQL语句,SQL语句相关的解析树(解析树也就是对SQL语句中所涉及到的所有对象的展现),执行计划,用户提交的PL/SQL程序块(包括匿名程序块,存储过程,包,函数等)以及它们转换后能够被 Oracle执行的代码等,为了对这些内存结构进行管理,library cache中还存放了很多控制结构,包括lock,pin,dependency table,11G中的mutex等。
Library cache由一个hash表组成,hash表是由hash buckets组成的数组。
每个hash bucket都是包含library cache handle的一个双向链表。
library cache handle指向library cache object和一个引用列表。
library cache 对象进一步分为:依赖表、子表、授权表等
同一个SQL语句,HASH值相同,放在同一个library cache handle--如绑定变量,是用同一个library cache handle下不同的的子游标。不同的SQL语句,HASH值相同放在同一hash bucket的不同library cache handle。
Hash 算法
Oracle在内部管理中大量的使用到了hash,使用hash的目的就是为了快速查找和定位.对数值进行hash运算,产生一个索引号,然后根据索引号将数值放置到相应的hash bucket中去.
根据hash运算的法则,会产生多个索引号,每一个索引号对应一个hash bucket(一个数值列).
在寻找数值的时候,将搜寻的数值进行hash,产生一个索引号,那么这个数值一定在这个索引号对应的 hash bucket中,于是直接跳转到这个hash bucket中进行遍历。这样在定位数据的时候,就能够大大的减少遍历的数量。
库缓存中就是使用hash bucket来管理的
1、首先根据shared_pool_size指定的尺寸来自动计算hash bucket的个数
2、每个hash bucket后面都串联着多个句柄
句柄描述了library cache里面的对象的一些属性,包括名称、标记、指向对象所处的内存地址的指针
SQL语句在Library cache检查过程
1. 一条SQL语句进入2. 将SQL文本转化为ASCII值
3. 对ASCII等参数进行hash函数的运算
4. 得到一个数值、就是hash bucket的号码
5. 将对象句柄 library cache handle 放进相应的hash bucket中去--父游标
6. 进程要处理某个对象,例如一条SQL语句
7. 对语句进行hash,得到一个编号
8. 进入hash bucket中进行扫描
该对象句柄存在,直接使用
该对象句柄存在,对象被交换出内存、装载对象
句柄不存在,重新构建一个对象,挂在到hash bucket上
select owner,name from v$db_object_cache where child_latch=1;显示library cache中那些对象被缓存,以及对象的尺寸
####################################################3
通过x$kglob找出SQL语句父游标地址,并DUMP library cache,在TRACE文件中父游标的地址中找到SQL语句。
会话1SYS@ bys3>select * from bys.dept;
SYS@ bys3>col KGLNAOBJ for a40
KGLHDADR KGLHDPAR KGLNAOBJ KGLOBHD0
-------- -------- ------------------------------ --------
23ACB574 248344B8 select * from bys.dept 242B7D1C --23ACB574子游标地址
248344B8 248344B8 select * from bys.dept 23FE4684 --248344B8父游标地址,父游标heap 0地址-其实是描述符-23FE4684
select KGLHDADR,KGLHDPAR,KGLNAOBJ,KGLOBHD0 from x$kglob where kglnaobj like 'select * from bys.dept%' and KGLHDADR<>KGLHDPAR ; 查出子游标
select KGLHDADR,KGLHDPAR,KGLNAOBJ,KGLOBHD0 from x$kglob where kglnaobj like 'select * from bys.dept%' and KGLHDADR=KGLHDPAR ; 查出父游标
SYS@ bys3>select KSMCHPTR,KSMCHCOM,KSMCHCLS,KSMCHSIZ from x$ksmsp where KSMCHPAR='23FE4684'; --通过上一步查出的 heap 0描述符找到查看父游标所在CHUNK地址大小描述状态
KSMCHPTR KSMCHCOM KSMCHCLS KSMCHSIZ
-------- ---------------- -------- ----------
241D3A44 KGLH0^a8dc75cd recr 4096
新打开一个会话:DUMP library cache并查找SQL语句。
SYS@ bys3>alter session set events 'immediate trace name heapdump level 2050';
SYS@ bys3>select value from v$diag_info where name like 'De%';
VALUE
----------------------------------------------------------------------------------------------------
/u01/diag/rdbms/bys3/bys3/trace/bys3_ora_31638.trc
#################
VI中查询: 在241D3A44这个地址开始的这个 Chunk中找到了SQL语句
Chunk 241d3a44 sz= 4096 recreate "KGLH0^a8dc75cd " latch=(nil)
ds 23fe4684 sz= 4096 ct= 1
Dump of memory from 0x241D3A44 to 0x241D4A44
241D3A40 80001001 241D2A44 00000000 [....D*.$....]
241D3A50 00000000 00000000 00000000 000A0FFF [................]
………………
Chunk 2405e530 sz= 4096 recreate "SQLA^bf04295e " latch=(nil)Dump of memory from 0x2405E530 to 0x2405F530
2405E530 800010