KGL=Kernel General Library 缓存管理器,顾名思义,它处理库对象,例如游标、缓存的存储对象定义(PL/SQL 存储过程、表定义等)。
如果缓存比当前大,KGL 模拟器用于估计缓存的好处。一般的想法是,当刷新库缓存对象时,它的哈希值(以及其他一些信息)仍然保留在 KGL 模拟器哈希表中。这存储了在内存中但被清除的对象的历史记录。
当加载一个库缓存对象(这意味着库缓存中没有现有的此类对象)时,Oracle 会检查 KGL 模拟器哈希表以查看其中是否存在具有匹配哈希值的对象。如果找到匹配的对象,则意味着所需的对象过去曾在缓存中,但由于空间压力而被刷新。
如果缓存更大(感谢 KGL 模拟器历史记录)并知道对象重新加载花费了多少时间,Oracle 可以预测多少响应时间本来是可以避免的,使用该信息可以避免多少库缓存对象(重新)加载如果共享池更大,则保存实例范围。这可以从 v$library_cache_advice 看出。
无论如何,这个错误可能是由受害者会话引发的,因为共享池空间不足。换句话说,其他人可能已经用完了所有内存(或所有足够大的块),因此 KGL sim 的分配失败。
v$sgastat 将是解决 ORA-4031 错误的第一点,您需要确定共享池中有多少可用内存(以及谁在使用大部分内存)。
-- Tanel Poder
http://blog.tanelpoder.com