Oracle Library Cache深入解析(3)

再补充一点,无效和库缓存对象的老化并不一样。老化是连句柄带对象的所有内存块都被清除出去了。而无效是只在库缓存中保留对象句柄,但所有其他内存块都被清除出去。对于无效的对象,当再次重新调用到它时,Oracle会再次将它调入到库缓存中,这个操作被称为Reload。一般说来,Reload与Get是无关的,因为Reload是在对象无效后才发生的,而对象的无效并不影响对象句柄。好,说了这么多,下面我们来看这些值的意义。

我们已经讲述了Get、Pin与它们的命中、未命中,还有什么是Invalidation和Reload。在OLTP系统中,Get的命中率应该在90%之上。而Reload和Pin的次数的比值,应该小于1%。如果超出了这些数值范围,就说明库缓存的使用有问题。问题的原因主要有两个,没有使用绑定变量或是库缓存太小。不过Reload和Pin的比例过高,也可能是在繁忙时执行了DDL所导致的。

另外,V$librarycache的第一列是NAMESPACE,也就是名称空间。它相当于存储在库缓存中对象的类型。具体的名称空间是什么意思呢?就是对象的名字所在的范围,比如表和列的名字就不在一个范围内。也就是说表名和列名可以重复,还有用户名和表、列也不在同一范围内,用户名也可以和表、列名相同。我可以有个叫做AA的表,也可以有叫做AA的用户。这两个AA处在不同的范围内,也就明它们的名称空间不同。这就好像在北京有个电话号码是12345678,在上海也有个12345678,这两个电话号码虽然相同,但不会引起问题,因为它们在不同的范围内。这个范围,也可以说是类型。

我显示一下V$librarycache的所有行(列只有一部分):
SQL> select * from v$librarycache;
NAMESPACE            GETS    GETHITS GETHITRATIO      PINS  PINHITS
--------------- ---------- --------------------- ---------- ----------
SQL AREA            21811      4149 .190225116    120258    105272
TABLE/PROCEDURE      25152    16372  .650922392      60649    46008
BODY                  4360      4098 .939908257      5931      5537
TRIGGER                320        251    .784375      1655      1576
INDEX                  453        128 .282560706      2065      1531
CLUSTER                755        728 .964238411      2339      2296
OBJECT                  0          0          1          0          0
PIPE                    0          0          1          0          0
JAVA SOURCE            0          0          1          0          0
JAVA RESOURCE            0          0          1          0          0
JAVA DATA                0          0          1          0          0

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/5f8b097bfad8b6d883679239b0a8e44d.html