Oracle Shared Pool之Library Cache

1. Shared Pool组成
  Shared Pool由许多区间(Extent)组成,这些区间又由多个连续的内存块(Chunk)组成,这些内存块大小不一。从逻辑功能角度,Shared pool主要包含三个部分:Library Cache,Dictionary Cache和Control Structure。而这里,我们主要介绍其中的Library Cache。
2. Library Cache

  Library Cache主要用于存储系统中的可执行对象(例如:SQL语句,PL/SQL块及相关对象等)及其相关信息(解析信息,可执行代码,相关对象及信息,相关控制结构等),以便实现这些可执行对象及其相关信息的快速访问和共享。

3. Hash Bucket

   Hash Bucket主要用于特定可执行对象的快速定位和存取,每个哈希桶中对应一个将多个可执行对象连接起来的链表,而这些可执行对象在链表中的表现形式就是可执行对象的句柄(Handle),当需要定位或访问特定对象时,系统通过对特定SQL或PL/SQL对象做特定哈希计算,就可以快速得知该特定对象应该位于的哈希桶,而每个哈希桶的链表比较短,尤其是高版本的Oracle中,哈希桶的链表更短,这样,在哈希桶链表中定位和访问特定对象会非常快速。至于Library Cache中哈希桶的数目,系统会根据Shared Pool的大小自动算出,以确保哈希桶在够用的同时,也不会导致哈希桶中对象数目过多而影响定位和访问的效率。哈希桶示意图如下所示。


4. Hash Latch

    前面讲到了哈希桶及其链表,当多个用户同时访问这些哈希桶和链表时,就会出现冲突和问题,为了实现用户对这些哈希桶及其链表的有序访问和共享,Oracle通过一种叫做哈希Latch的机制来保护这些共享资源,当一个用户需要访问或修改这些哈希桶及其链表时,需要首先获取其上的哈希Latch,期间,其他需要获取相同哈希Latch的用户或会话就需要等待,直到持有该哈希Latch的用户释放为止,需要提出的是,并不是针对每个哈希桶都有一个哈希Latch,而是一个哈希Latch覆盖多个哈希桶,这样,当不同用户即使不是访问同一个哈希桶及其链表时,只要被同一个哈希Latch覆盖,也是需要等待该哈希Latch被释放才可以。哈希Latch具体如下所示。


5. Library Cache Handle

  上面我们也提到,每个哈希桶通过链表将多个可执行对象连接到一起,而这些可执行对象在其中以对象句柄形式存在在,这些句柄包含了这些对象的相关属性,例如:名称、标记、指向对象内存地址的指针等。Library Cache Handle具体如下所示。


6. Library Cache Object
  哈希桶中链表上的Handle对应的是可执行对象(Library Cache Object),这些对象由一些独立的堆(Heap)所组成,具体说,哈希桶中链表上的Handle指向这些可执行对象时,其实是指向它的第一个堆(heap 0),其中记录了指向该对象其他堆(Heap)的指针信息等,这些堆具体包括:
   1)依赖表(Dependency Table):当前对象(Library Cache Object,简称LCO)依赖的其它对象信息,例如:该对象所依赖的表、视图、索引等。
   2)子表(Child Table):当前对象的子LCO及其相关信息。
   3)数据块(Data Block):当前对象的SQL语句、执行计划、执行文本等信息。
   。。。

   Library Cache Object具体如下所示。


7.Library Cache整体示意图如下所示。


 8. 父游标/子游标(Parent Cursor/Child Cursor)

     当Oracle用户提交SQL或PL/SQL等可执行对象后,这将在Library Cache中生成一个叫做游标(cursor)对象,这些游标对象可被多个会话共享,这样既节省了资源又提高了效率。同时,每个游标又由两部分表达和限定,即父游标(Parent Cursor)和子游标(Child Cursor),这些通过系统相关动态视图可以查询和了解。父游标和子游标具体如下所示。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: library cache lock是Oracle数据库中的一种锁,用于保护共享池中的共享内存区域,以确保多个会话不会同时修改同一块内存。当一个会话正在修改共享池中的某个内存区域时,其他会话需要等待该锁释放后才能访问该内存区域。如果该锁被长时间持有,可能会导致其他会话的性能下降。因此,需要对该锁进行优化和监控。 ### 回答2: library cache lock(库缓存锁)是Oracle数据库中的一种锁机制,用于在共享池(Shared Pool)中保护和管理库缓存(Library Cache)中的共享内存结构。 库缓存是Oracle数据库中存储SQL语句执行计划、存储过程以及其它重要对象的内存区域。在并发环境下,多个会话(Session)可能同时请求某一对象的执行计划或存储过程,为了避免冲突和数据不一致性,需要通过库缓存锁来进行协调。 当一个会话请求某一对象的执行计划或存储过程时,数据库会先检查库缓存中是否已经有该对象的锁。如果该对象的锁已经存在,会话就需要等待,直到之前的会话释放锁。如果该对象的锁不存在,数据库会为当前会话创建一个库缓存锁。当一个会话对某一对象的执行计划或存储过程进行修改时,会话首先获得该对象的库缓存锁,然后可以对该对象进行修改。 库缓存锁的粒度非常细,可以是数据库级别、模式级别、对象级别甚至是子对象级别的。库缓存锁的管理是自动的,由Oracle数据库内部自动分配和释放。 库缓存锁的存在可以保证多个会话在并发访问数据库时的数据一致性和资源的安全性。但是,如果过多的会话同时请求同一个对象的锁,也可能导致性能瓶颈和资源竞争,从而影响数据库的性能和响应速度。 为了减少库缓存锁的竞争,可以通过优化SQL语句、增加共享池大小、调整并发连接数等方式来提高数据库的性能和性能。同时,也可以使用Enable Row-level Locking(启用行级锁)的方式来减少库缓存锁的使用。 ### 回答3: library cache lock是Oracle数据库中的一种锁定机制,用于保护共享SQL和PL/SQL对象在库缓存中的访问。 在Oracle数据库中,库缓存是用于存储数据库的共享SQL和PL/SQL对象的重要组件。它包含了解析树、执行计划、存储过程等重要对象的定义和元数据。多个会话可以同时访问共享的库缓存对象,但在某些情况下,需要使用库缓存锁来保护对象的访问和修改。 当一个会话需要对一个共享的库缓存对象进行修改时,它会请求一个library cache lock。这个锁会阻塞其他会话对同一个对象的修改,直到持有锁的会话完成修改操作并释放锁。这种机制能够确保在并发访问的情况下,库缓存对象的一致性和正确性。 库缓存锁是Oracle数据库中的一种共享锁,意味着它可以被多个会话同时持有。它可以阻止其他会话对同一个对象的并发修改,但不会阻止读取操作。这种锁是为了避免并发访问造成的竞争条件和冲突,确保库缓存中的共享对象的正确性。 库缓存锁是通过Oracle数据库的内部机制自动管理的,用户不需要手动操作。当会话需要修改一个库缓存对象时,数据库会自动分配和管理合适的锁。在执行完修改操作后,会话会自动释放锁,以便其他会话能够继续访问和修改对象。 总之,library cache lock是Oracle数据库中用于保护共享SQL和PL/SQL对象在库缓存中访问的锁定机制。它确保了对象的并发访问的一致性和正确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lhdz_bj

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值