共享内存(Shared Pool)之一:Library cache逻辑结构

What is shared pool?

  Shared pool是SGA中的一部分,由于它是SGA的一部分,这意味着它可以被所有的进程所访问。Shared pool物理层面上由许多内存块组成,这些内在块称为chunk。但是chunk是大小不一的,在内存中一个chunk是连续的。

  按逻辑结构划分:Shared Pool主要包含了3部分:Library cache,Dictionary cache和Control Structure。

技术分享

  由于shared pool中最重要的是library cache,所以本文主要讲解Library cache的结构: library cache latch,library cache lock,library cache pin。

What is Library Cache?

         Library cache是包含了共享SQL区(shared SQL areas),私有SQL区(private SQLareas,如果配置了共享服务器),PL/SQL存储过程以及包,还有一些控制信息(比如说locks以及library cache handles)的内存

Library Cache逻辑结构

  • Hash Bucket / Bucket

     Oracle内部在实现管理的过程中大量用到了hash算法。所谓hash算法,就是根据要查找的值,对该值进行一定的hash算法后得出该值所在的索引号(Hash Bucket),通过索引号(Hash Bucket)去到对应的链表(bucket),然后再进入所确定的链表里,对其中所含有的值,进行一个一个的比较,从而找到该值。

  链表(bucket)的物理结构是由chunk组成。每个链表(bucket)中的chunk个数不固定;相同链表(bucket)中的chunk大小相同;不同的bucket中的chunk的大小不同。

  • Library Cache handle

     我们对Library cache中所有对象的访问是通过利用library cache handle来实现的,也就是说我们想要访问library cache object,我们必须先找到library cache handle。

     Library cache handle指向library cache object;Library cache handle包含了library object的名字,命名空间,时间戳,引用列表,lock对象以及pin对象的列表信息等等。Library cache handle也被library cache用来记录哪个用户在这个这个handle上有lock,或者是哪个用户正在等待获得这个lock。那么这里我们也知道了library cache lock是发生在handle上的。

  • Library Cache Object

         Library Cache Object是由一些独立的heap所组成,前面说了Library cache handle指向Library cache Object,其实handle是指向第一个heap,这个heap 我们就称之为heap 0。Heap 0记录了指向其他heap的指针信息。

技术分享

  1. Dependency table --当前LCO依赖的其它LCO信息,如SQL语句依赖的表、视图等. (LCO :library cache object)
  2. Chile table----保存当前LCO的子LCO信息。
  3. Data blocks ---保存SQL语句、执行计划、执行文本等信息
  • parent cursor/ child cursors

       当用户提交SQL语句或PL/SQL程序块到oracle的shared pool以后,在library cache中生成的一个可执行的对象,这个对象就叫做游标(cursor)。

       不要把这里的游标与标准SQL(ANSI SQL)的游标混淆起来了,标准SQL的游标是指返回多条记录的SQL形式,需要定义、打开、关闭。下面所说到的游标如无特别说明,都是指library cache中的可执行的对象。

       游标是可以被所有进程共享的,也就是说如果100个进程都执行相同的SQL语句,那么这100个进程都可以同时使用该SQL语句所产生的游标,从而节省了内存。

       每个游标都是由library cache中的两个或多个对象所体现的,至少两个对象。一个对象叫做父游标(parent cursor),包含游标的名称以及其他独立于提交用户的信息(v$sqlarea视图里看到的都是有关父游标的信息);另外一个或多个对象叫做子游标(child cursors)。例如SQL文本相同,但提交SQL语句的用户不同,有可能生成不同的子游标。

技术分享

 

 

 

 

 

 

 

 

 

 参考blog:

http://czmmiao.iteye.com/blog/1273261

http://blog.csdn.net/robinson1988/article/details/6037925

 

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。