library cache
一、library cache与shard pool的关系
1.library cache是shared pool内的一块空间,大小由shard pool自动分配,library cache与dictionary cache都存放在shared pool中
2.存放sys用户所拥有的对象的空间,称为dictionary cache
3.存放用户sql语句,pl/sql代码、解析树、执行计划等的空间称为library cache
4.library cache与dictionary cache空间互换
当dictionary cache需要缓存新的数据字典时,shared pool剩余空间不足,会将library cache中最不常使用的内容覆盖
1.library cache是shared pool内的一块空间,大小由shard pool自动分配,library cache与dictionary cache都存放在shared pool中
2.存放sys用户所拥有的对象的空间,称为dictionary cache
3.存放用户sql语句,pl/sql代码、解析树、执行计划等的空间称为library cache
4.library cache与dictionary cache空间互换
当dictionary cache需要缓存新的数据字典时,shared pool剩余空间不足,会将library cache中最不常使用的内容覆盖
二、library cache与dictionary cache关系
library cache在执行sql语句时,需要参照dictionary cache里的数据字典(包括表名了、列名、权限等)
用户sql对字典的修改(比如修改某表的列名,添加列等)也会将结果返回给dictionary cache
library cache在执行sql语句时,需要参照dictionary cache里的数据字典(包括表名了、列名、权限等)
用户sql对字典的修改(比如修改某表的列名,添加列等)也会将结果返回给dictionary cache
三、library cache的管理方式
1.library cache由多个hash bucket队列管理,每个hash bucket存放着多个handle(句柄)
2.使用hash算法
server process将sql text转化为ASCII码,对ASCII码进行hash运算,产生hash bucket号,对号入座,找到相应hash bucket队列
2.使用hash bucket管理目的
通过hash算法,实现sql语句在library cache中的快速遍历,判断该sql在library cache中是否存在,如不存在,申请shared pool空间存放sql并将该空间存放在该hash bucket中;如存在,找该sql的handle;
3.使用handle的目的
句柄的含义像书的目录,对象的含义像书中页的内容;通过句柄找对象就像通过目录查找书页,提高查找对象的速度,
通过handle找到heap0(heap0存放着执行计划)
1.library cache由多个hash bucket队列管理,每个hash bucket存放着多个handle(句柄)
2.使用hash算法
server process将sql text转化为ASCII码,对ASCII码进行hash运算,产生hash bucket号,对号入座,找到相应hash bucket队列
2.使用hash bucket管理目的
通过hash算法,实现sql语句在library cache中的快速遍历,判断该sql在library cache中是否存在,如不存在,申请shared pool空间存放sql并将该空间存放在该hash bucket中;如存在,找该sql的handle;
3.使用handle的目的
句柄的含义像书的目录,对象的含义像书中页的内容;通过句柄找对象就像通过目录查找书页,提高查找对象的速度,
通过handle找到heap0(heap0存放着执行计划)
四、library cache工作机制
1.用户执行sql语句,server process将sql text转化为ASCII码
2.ASCII做hash运算,得到hash bucket号,找到hash bucket队列
3.判断该sql语句是否存在hash bucket中
a.存在该语句(以往执行过)且找到该语句的句柄,执行软解析
b.存在该语句(以往执行过)但未找到该语句的句柄,重新加载相关对象(reload),执行软解析
c.不存在该语句(该语句第一次执行)
申请shard pool空间,存放新的sql语句,先获得shared pool latch,在shared pool中的找bucket链表中可用的chunk,之后释放latch
存放新sql的空间即library cache,执行硬解析
1.用户执行sql语句,server process将sql text转化为ASCII码
2.ASCII做hash运算,得到hash bucket号,找到hash bucket队列
3.判断该sql语句是否存在hash bucket中
a.存在该语句(以往执行过)且找到该语句的句柄,执行软解析
b.存在该语句(以往执行过)但未找到该语句的句柄,重新加载相关对象(reload),执行软解析
c.不存在该语句(该语句第一次执行)
申请shard pool空间,存放新的sql语句,先获得shared pool latch,在shared pool中的找bucket链表中可用的chunk,之后释放latch
存放新sql的空间即library cache,执行硬解析
附:
查询用户169产生会话等待的sql text
select sql_text
from v$sqltext a
where a.hash_value=(select sql_hash_value
from v$session b
where b.sid=145);
select sql_text
from v$sqltext a
where a.hash_value=(select sql_hash_value
from v$session b
where b.sid=145);
此处说明了sqltext是经过hash运算的
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26188260/viewspace-713926/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/26188260/viewspace-713926/