Oracle Library cache

2020-02-20  本文已影响0人  judeshawn

Library cache位于Oracle实例SGA中的shared pool,用于缓存SQL游标、PLSQL程序以及Java类的可执行形式。

当一条SQL运行时,如果它在不久前已经被执行过,那么Oracle会尝试重用这条SQL的。一条从未执行过的SQL进入数据库获取数据需要经过编译和解析,然后生成最终的可以直接调用的执行计划结果,再按照这个执行计划来从相关的数据库表中获取数据。如果语句解析后的结果已经缓存在了library cache中,那它就能够被重用,这就叫做软解析,或者叫library cache hit。相反,如果library cache中没有缓存,则必须重新解析生成新的执行计划,然后放入library cache中执行,这就叫做硬解析,或者叫library cache miss

当执行SQL时,library cache miss可以发生在解析阶段或执行阶段。当解析调用SQL语句时,如果语句的解析表达式不存在于library cache中,数据库会解析语句然后将解析后的结果存放在shared pool中。

硬解析应该尽可能少,所以应用开发人员在设计系统时应该考虑如何让SQL语句在只解析一次的情况下执行更多次。这需要用到游标(cursors)。有经验的SQL程序员应该熟练掌握打开和重执行游标的概念。

必须确保SQL语句在共享池中被共享。使用绑定变量来表式多个相似SQL语句中不一样的部分。否则,有可能出现特别多的语句在第一次解析之后就再也不会被重用。

例如:

SELECT * FROM employees 
  WHERE last_name LIKE 'KING';

应该改成

SELECT * FROM employees 
  WHERE last_name LIKE :1;

library cache结构和概念

所有SQL和PLSQL语句的执行计划都存放在Library cache内存区

而library cache可以进一步划分为:

共享的和私有的SQL区域

共享的SQL区包含一条单独SQL语句或多条相似SQL的解析树和执行计划。Oracle让多条相似的DML语句使用同一个共享SQL区,从而达到节省内存的目的。尤其是当多个用户使用同一个应用时。

共享SQL区总是在shared pool中。解析一条SQL语句时会从shared pool中请求内存。如果一条SQL语句需要新的SQL区,但shared pool中没有剩余空间时,Oracle会根据LRU算法来清理pool中的内容,直到空间足够分配新的共享SQL区。

私有SQL区包含类似于绑定信息和运行时缓存这类数据。每个执行SQL的会话都有一个私有SQL区。每个提交SQL语句的会话用户都有自己的私有SQL区,这个私有SQL区只会使用一个单独的共享SQL区。而同一个共享SQL区可以和多个私有SQL区关联使用。

私有SQL区里有一个固有区和一个运行时区:

PLSQL过程部分

oracle处理PLSQL程序和处理单独SQL语句的方式大致相同。

oracle分配共享区来存放程序单元的解析、编译形式,分配私有区来存放每个会话在执行程序单元时特有的值,其中包括本地变量、全局变量、和package变量以及执行SQL时需要的缓存。如果多个会话执行同一个程序单元,所有会话共享一个共享区,而各个会话维护各自的私有SQL区,持有各自会话特有的值。
PLSQL程序单元中的单独SQL语句和PLSQL程序外的SQL语句一样,尽管处于PLSQL程序单元中,这些SQL语句仍然使用共享区来持有解析形式,使用私有区来存放会话特有的信息。
x$ksmss表中提供了关于library cache中PLSQL区的运行时信息

Library Cache管理器

library cache的主要目的是提供一种快速定位和存储library cache object(LCO)的机制。使用一种hash机制来定位含有object id的handle。library cache handle(LCH)指向一个或多个library cache objects以及它们的内容

library cache缓存了不同类型的library cache object(比如,packages,procedures,functions,shared cursors,命名PLSQL块,表定义,视图定义,form定义)

KGH heap Manager:
shared pool和PGA都是由一个Oracle的内存管理器来管理,我们称之为KGH heap manager。它不是一个进程,而是一串代码。heap Manager主要目的是满足server进程请求内存的时候分配内存或者释放内存。Heap Manager在管理PGA的时候,需要和操作系统打交道来分配或者回收内存。但是,在shared pool中,内存是预先分配的,Heap Manager管理所有的空闲内存。
当某个进程需要分配share pool的内存的时候,Heap Manager就满足该请求,heap manager也和其他Oracle模块一起工作来回收shared pool的空闲内存。

library cache内存是从SGA heap的最顶端开始分配内存。当Library cache需要更多内存的时候,会调用KGH heap manager来分配。Library cache是由一个hash表组成,hash表是一个由许多hash buckets组成的向量。每个hash bucket是由多个LCH组成的双链列表。每个handle指向一个object并且有一个reference list。

Library Cache Manager(hash表和hash bucket)

Library cache manager(LCM)可以看做是Heap Manager的客户端,因为LCM是根据Heap Manager来分配内存从而存放LCO。LCM控制着所有的LCO,包括package/procedure,cursor,trigger等等。

library cache是有hash table组成,这个hash table又由hash bucket组成的数组构成,每个hash bucket又是由一些相互指向的LCH组成,LCH指向具体的LCO以及一些引用列表。

hash table初始化由251个hash buckets组成,当hash table中的buckets不够用时,会自动扩展长度,每次扩展之后,buckets数量大约是原来的2倍,但这个值必定是一个质数。准确地讲,如果是第n次扩展,则扩展后的长度为不大于2^(n+8)的最大质数。hash table在扩展的时候,实际上是新建了一个长度大约为原来2倍的新的hash table,然后将原来hash table上的对象重新组织在新的hash table上,因此,hash table在扩展的时候是不可访问的。但这是一个不怎么耗资源的操作,一般来说3-5秒内即可完成。

hash table只会扩展不会收缩。

Library Cache Handle

Library Cache Handle(LCH)执行Library cache object(LCO).它里面含有LCO的name、namespace、timestamp、reference list、lock请求列表和pin请求列表。每个LCO都是通过LCH里的name和namespace联合起来作为唯一标识。

共享池:library cache统计

在规划共享池大小时,我们的目的是确保多次执行的SQL语句被缓存在library cache中,不需要分配太多内存。

v$librarycache视图是用于统计自最近一次数据库重启以来的library cache中各个组件的使用情况。

v$librarycache视图中的reload列表示被踢出缓存的SQL语句被再次执行硬解析的次数。这个值应该尽可能少或接近于0.

v$librarycache视图中的invalidations列表示library cache中的数据失效,从而需要重新解析的次数,通常,DDL语句改变了元数据使得SQL语句解析缓存失效时,这个值会增加。

另一个关键指标是共享池在业务高峰期的剩余内存。可以通过v$sgastat视图查看。剩余内存应该尽可能少

SQL解析执行全过程总结:

当一条SQL进来:

library cache pin和library cache lock

如果进程想要真正使用或修改这个object,那么必须获得object data heap 本身的library cache pin,也就是在获得lock之后获得。pin住object的过程中,如果data heap的信息和数据被aged out,则必须将它们重新加载进来。data heap被pin住的时候,不能被aged out出内存。lock和pin的信息可以分别通过x$kgllkx$kglpn两个视图查看

library cache lock模式

如果只是读取object,则获取(S)share模式的锁;如果需要修改object,则获取(X)exclusive模式的锁;Null锁比较特殊,用于维护object的依赖对象,在访问object的时候会一直持有,持有期间,object的依赖对象可以被其他进程访问甚至修改,通常,如果依赖对象被修改,则Null锁被打破,object会被标记为invalid。object下次被访问时,则需要重新解析成二进制可执行文件。

上一篇 下一篇

猜你喜欢

热点阅读