网络通信 频道

广电再出狠招 IPTV前途坎坷


2.3 dictionary cache概述
    dictionary cache专门用来存放SYS schema所拥有的对象的内存区域。使用dictionary cache时以行为单位,而不像其他比如buffer cache以数据块为单位,因此dictionary cache也叫做row cache。构造dictionary cache的目的是为了加快解析SQL语句的速度,因为dictionary cache里存放了所有表的定义、Storage信息、用户权限信息、约束定义、回滚段信息、表的统计信息等。
    而这些信息都是在解析过程中必须用到的。假设oracle在解析SQL的过程中,发现dictionary cache里没有该SQL所引用的表的定义信息,则oracle必须到磁盘上system表空间里找到这个引用表的定义信息,并将这些定义信息加载到dictionary cache里。这个从磁盘上获取数据字典数据的过程就叫做递归SQL(Recursive SQL)。通常来说,当我们执行一条新的SQL语句时,都会产生很多次的递归调用,也会产生很多的递归SQL。比如我们来下面这个例子。 
   SQL> set autotrace traceonly stat;
   SQL> select * from sharedpool_test;
   Statistics
   ----------------------------------------------------------
    185 recursive calls
    0 db block gets
    25 consistent gets
   ………… 

    从这里可以很明显看到执行该SQL产生了185次的递归调用,这185次的递归调用将表sharedpool_test相关的信息,比如列定义、统计信息等,都加载到了dictionary cache里。当我们再次执行该SQL时,会发现recursive calls变成了0,因为dictionary cache里已经包含解析SQL所需要参照的数据字典了。 
  

转储dictionary cache
  我们可以使用如下命令对dictionary cache进行转储。
  ALTER SESSION SET EVENTS 'immediate trace name row_cache level N';

这里的N可以取的值分别为:

1 转储dictionary cache的统计信息 ;
2 转储hash表的汇总信息 ;
8 转储dictionary cache中的对象的结构信息;

  如果对level 1进行转储,可以看到转储出来的内容,很明显,就是v$rowcache里的内容。每一种数据字典都有一行记录来表示。比如有tablespace相关的数据字典等。

  如果以level 2转储的话,可以看到类似如下的内容。这里有23个hash表对dictionary cache中的对象进行管理,每个hash表都对应了一种数据字典,同时有一个名为row cache objects的latch来控制并发访问。可以看到,v$latch_children里名为“row cache objects”的记录数量也是23。

ROW CACHE HASH TABLE: cid=0 ht=66BD90B0 size=32

…………

ROW CACHE HASH TABLE: cid=1 ht=66BD78B0 size=256

…………

ROW CACHE HASH TABLE: cid=22 ht=66DA5590 size=512

…………
0
相关文章