Library cache是Shared pool的一部分,它几乎是Oracle内存结构中最复杂的一部分,主要存放shared curosr(SQL)和PLSQL对象(function,procedure,trigger)的信息,以及这些对象所依赖的table,index,view等对象的信息。
二,库缓存01,存放的单元
Library存放的信息单元都叫做对象,这些对象可以分为两类:
(1) 存储对象:
(2) 过渡对象:
三,查看命中率SQL> desc v$librarycache Name Null? Type ----------------------------------------- -------- ---------------------------- NAMESPACE VARCHAR2(64) GETS 某个object解析的时候查找的次数(解析阶段) NUMBER GETHITS get命中次数 NUMBER GETHITRATIO 这个值等于gethits/gets NUMBER PINS object 解析过后被执行的次数(发生在执行阶段) NUMBER PINHITS pin命中次数 NUMBER PINHITRATIO 这个值等于pinhits/pins NUMBER RELOADS某个object 解析过后被从新加载的次数(需要从新从磁盘读取object),也就是没有被缓存到library cache中,这个通常由于shared pool 过小 NUMBER INVALIDATIONS 某个对象无效,通常由于对象定义被更改,需要从新解析 NUMBER DLM_LOCK_REQUESTS NUMBER DLM_PIN_REQUESTS NUMBER DLM_PIN_RELEASES NUMBER DLM_INVALIDATION_REQUESTS NUMBER DLM_INVALIDATIONS NUMBER
查看总的library cache pinhitratio 应该大于90%,最理想大于95%
SQL> select sum(pinhits)/sum(pins) pinhitratio from v$librarycache; PINHITRATIO ----------- .95701484
SQL> select sum(pins)/(sum(pins)+sum(reloads)) reloadhitratio from v$librarycache; RELOADHITRATIO -------------- .995477741
查看reloadhitratio 应该小于1%
SQL> select sum(reloads)/sum(pins) from v$librarycache; SUM(RELOADS)/SUM(PINS) ---------------------- .004542493
查看各个类型的library cache ratio, 看pinhitratio 这一行
SQL> select namespace,pins pinhits ,pinhitratio from v$librarycache; NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- SQL AREA 316416 .969154531 TABLE/PROCEDURE 81435 .94126604 BODY 48572 .998332373 NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- TRIGGER 228 .903508772 INDEX 2622 .768878719 CLUSTER 668 .986526946 NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- DIRECTORY 4 .5 QUEUE 6 .333333333 RULESET 3 .666666667 NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- TEMPORARY TABLE 808 0 TEMPORARY INDEX 302 0 EDITION 1560 .998717949 NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- DBLINK 0 1 OBJECT ID 0 1 SCHEMA 0 1 NAMESPACE PINHITS ---------------------------------------------------------------- ---------- PINHITRATIO ----------- DBINSTANCE 0 1 SQL AREA STATS 3347 .035853003 SQL AREA BUILD 0 1 18 rows selected
查看当前 library cache 的大小
SQL> select sum(sharable_mem) from v$db_object_cache; SUM(SHARABLE_MEM) ----------------- 137677939
查看剩余的 shared pool
SQL> select * from v$sgastat where name='free memory' and pool='shared pool'; POOL NAME BYTES ------------ -------------------------- ---------- shared pool free memory 216291184
数据库的 library cache hitratio 最好应该在95%以上,sum(reloads)与sum(pins) 的比值应该小于 1%,如果pinhitratio 小于90%,或者reload ratio 大于1% ,而且shared pool 的free memory 很小或者为0,那么可以适当增加shared_pool的大小,检查应用程序代码效率,比如是否使用了绑定变量等等.