关于Oracle LATCH:LIBRARY CACHE
LIBRARY CACHE管理着和CURSOR相关的所有信息区域,LIBRARY CACHE的效率直接决定着CURSOR的执行效率。实践表明,与SHARED POOL相关的性能问题往往是和LIBRARY CACHE相关的。所以我们有必要详细地研究LIBRARY CACHE结构,因为通过研究它的结构,可以为我们优化LIBRARY CACHE提供思路。
SHARED POOL的内存由KGH(Kernel Generic Heap)管理,LIBRARY CACHE则由KGL(Kernel Generic Library Cache)管理,KGL利用KGH分配得到必要的内存CHUNK。图8-21为LIBRARY CACHE的内存结构。
LIBRARY CACHE LATCH主要用于保护检索并管理LIBRARY CACHE。SQL文本经过Oracle内部的HASH函数生成一个HASH值,然后根据HASH值检索LIBRARY CACHE是否存在相同的SQL,在此过程中需要获得LIBRARY CACHE LATCH。如果不存在相同的SQL则将SQL文本分配到适当的BUCKET上。具有相同HASH值的SQL以HANDLE为单位,以CHAIN的形式挂载到同一个BUCKET中。一个HANDLE管理着一个Library Cache Object(以下简称LCO)。HANDLE对实际的LCO起到指针作用。LCO保存着SQL的实际信息。其中BUCKET主要由LIBRARY CACHE LATCH保护;HANDLE由LIBRARY CACHE LOCK保护;LCO由LIBRARY CACHE PIN保护。LIBRARY CACHE LATCH的数量默认与大于CPU数量的最小质数值相同。如下所示:
SQL> show parameter cpu_countNAME TYPE VALUE
------------------------------------ ----------- ------------------------------
cpu_count integer 64
SQL> select count(*) from v$latch_children where name='library cache';COUNT(*)
----------67
另外,LIBRARY CACHE LATCH的数量受隐含参数_kgl_latch_count影响,LIBRARY CACHE BUCKETS受隐含参数_kgl_bucket_count影响。和CACHE BUFFERS CHAINS LATCH类似,一个LIBRARY CACHE LATCH也管理着多个LIBRARY CACHE BUCKETS。
提示 LIBRARY CACHE中BUCKET的作用(管理着相同HASH值的CURSOR信息)和BUFFER CACHE BUCKET(管理着相同HASH值的DBA数据块)类似,但和SHARED POOL中管理CHUNK的BUCKET完全不同。读者需要仔细的区别。
如果在申请LIBRARY CACHE LATCH过程中发生争用,则会发生LATCH: LIBRARY CACHE等待事件。
根据实践, LIBRARY CACHE LATCH发生争用时,并不是LIBRARY CACHE LATCH数量不够,而是局部的LIBRARY CACHE LATCH访问比较厉害。所以设置隐含参数_kgl_latch_count增加其数量往往不能缓减LIBRARY CACHE LATCH争用。