Oracle连载3—-共享池的内部结构及优化处理

是SGA的一个组件,共享池是为了让我们大家共享数据而设置的缓冲池。共享池的内存是通过Oracle 通用内存管理来进行管理。KGH heap Manager 所有共享池的free内存都被挂在成为freelists的空闲链表上,链表是按照bucket机制建立,更具空闲内存片段大小,挂在了不同的bucket上。

分配的内存是可释放的:freeable 或者 recreateable

其中 freeable 是可以直接释放的,而recreateable 的内存是在unpin之后释放。都是可以重用的内存

内部结构

采用堆管理的模式(HEAP)

堆管理的基础就是KGH。负责管理和维护共享池中的内存结构包括SQL语句、PL/SQL代码、执行计划等共享的数据库对象。

内存被划分为一系列大小不等的Memory Chunk。每个Memory Chuck 都有一个对应的Free List ,用于管理 Chunk 内的可用内存块。

子池设置的目的是为了提高共享池分配回收和管理的性能,加大共享池的并发访问能力,因此他的存在坑定能够提升共享池的性能,其次了解子池技术可能带来的负面影响,由于一个大的共享池会被分割为若干个较小的子池,每个子池独立管理Free List,因此采用子池后,每个子池的容量也就变小了,也就增加了共享池碎片化的可能性。

行缓冲(Row Cache )也叫做 字典缓冲,缓冲是以行为单位组织的。

字典缓存绝对不是纯粹的数据字典表的缓冲。数据字典表和普通的表没有不同,其数据块的缓冲也是相同的。而字典缓存是经过组织的,用于数据库运行中SQL解析,权限控制等用途的内部数据结构,是一种字典表的内存试图。如果Oracle在执行某个SQL的时候,为了SQL解析,需要访问一些字典表,从中获取一些数据,那么它会通过一些递归调用SQL来完成这些事。为了减少递归SQL的执行开销,这些行数据呗缓存在共享池中,这个缓存就是字典缓存。

库缓存和游标

库缓存是共享池的一个子堆

完整的游标包括一个父游标,并且至少包含一个子游标。

对于SQL 的文本做散列计算,会得到一个散列值,通过该散列值就可以找到相应的游标,由于散列值是根据游标名称的每个字符进行散列计算得到的。