标签:
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。
Library cache是包含了共享SQL区(shared SQL areas),私有SQL区(private SQLareas,如果配置了共享服务器),PL/SQL存储过程以及包,还有一些控制信息(比如说locks以及library cache handles)的内存
Oracle内部在实现管理的过程中大量用到了hash算法。所谓hash算法,就是根据要查找的值,对该值进行一定的hash算法后得出该值所在的索引号(Hash Bucket),通过索引号(Hash Bucket)去到对应的链表(bucket),然后再进入所确定的链表里,对其中所含有的值,进行一个一个的比较,从而找到该值。
链表(bucket)的物理结构是由chunk组成。每个链表(bucket)中的chunk个数不固定;相同链表(bucket)中的chunk大小相同;不同的bucket中的chunk的大小不同。
我们对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是由一些独立的heap所组成,前面说了Library cache handle指向Library cache Object,其实handle是指向第一个heap,这个heap 我们就称之为heap 0。Heap 0记录了指向其他heap的指针信息。
当用户提交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
共享内存(Shared Pool)之一:Library cache逻辑结构
标签:
原文地址:http://www.cnblogs.com/polestar/p/4337883.html