暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

【Oracle】Library Cache 详解

程序猿的向往 2021-08-10
1810

点击上方蓝字关注我们



01

简    介


库缓存主要用于缓存刚刚执行过的 SQL 语句和 PL/SQL 语句(如存储过程、函数、包、触发器)所对应的执行计划、解析树(Parse Tree)、Pcode、Mcode 等,当同样的 SQL 语句和 PL/SOL 语句再次被执行时无须再次从头开始解析,从而提高 SQL 语句和 PL/SQL语句重复执行的执行效率。V$DB_OBJECT_CACHE视图可以查看Library Cache的对象。


02

基础结构

点击链接 查看详情


Library Cache的基本结构


03

作    用


01快速定位数据库对象,并找到对应的信息

02Library Cache中存储着各库缓存对象的依赖关系,解决依赖问题

03Library Cache可以并发控制,管理大量共享对象的并发访问和修改问题


04

SQL解析


当SQL语句传到服务器,Oracle会先对目标SQL进行哈希运算,然后根据哈希值访问库缓存对象句柄链表,从而找到对应的库缓存对象句柄,重用SQL的执行计划、解析树而无需从头开始解析;如果找不到对应的库缓存对象句柄,则重新解析目标SQL,将解析后的资源以库缓存对象句柄的方式链接在对应Hash Bucket的库缓存对象句柄链表中。


05

并发控制


Oracle利用Library cache lock和Library cache 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。

每个handle上都有lock和pin的holder list和waiter list,用来保存持有该资源和等待该资源的队列。



06

Hash Latch

当多个用户同时访问或修改Hash Bucket和库缓存对象句柄链表时会出现冲突,为了解决这一问题,实现用户的有序访问和共享,Oracle生成Hash Latch的机制来保护这些共享资源,当一个用户需要访问或修改这些Hash Bucket及其库缓存对象句柄链表时,需要首先获取Hash Latch,如果期间有其他需要获取相同Hash Latch的用户或会话就需要等待,直到持有该哈希Latch的用户释放为止.





Hash Latch分类


shared pool latch分配或释放空间时使用

Library cache latchhash bucket中定位handle时使用

library cache lock latch获取library cashe lock时使用

library cache pin latch获取library cashe pin时使用



扫码

长按关注

关注

惊喜不断

喜欢就点个在看再走吧



文章转载自程序猿的向往,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论