日期:2014-05-16  浏览次数:20466 次

oracle 学习小结4
1 buffer cache 中有两个队列,一个是free buffer list,当数据被修改后,状态
变为dirty,移动到dirty list,dirty list上的都是侯选的可以被DBWR写出
到数据文件的buffer

2 buffer cache会存在latch竞争

3 oracle还提供了buffer bucket结构,就象图书馆寻找图书的索引卡片,用于快速判断数据块是否在
buffer cache中,抽屉中的每张卡片就是一个buffer header,实际上是以链表的形式存在闩在一起(cache
buffer chain),这就会产生cache buffer chain竞争,而增加bucket一点,可以快速进行搜索,但也
不是增加得越多越就越好

4 从8I后,每个buffer latch需要管理多个bucket,每个bucket上的buffer数量降低,latch性能提升

5 查询当前数据库最繁忙的buffer
    在x$bh中有个字段tch ,表明一个buffer的访问次数,越多越表明存在竞争:

SELECT *
  FROM (SELECT   addr, ts#, file#, dbarfil, dbablk, tch
            FROM x$bh
        ORDER BY tch DESC)
WHERE ROWNUM < 11;

再查询出这些热点buffer来自哪些对象:

SELECT e.owner, e.segment_name, e.segment_type
  FROM dba_extents e,
       (SELECT *
          FROM (SELECT   addr, ts#, file#, dbarfil, dbablk, tch
                    FROM x$bh
                ORDER BY tch DESC)
         WHERE ROWNUM < 11) b
WHERE e.relative_fno = b.dbarfil
   AND e.block_id <= b.dbablk
   AND e.block_id + e.blocks > b.dbablk;

  找出热点对象的相关信息:
SELECT distinct e.owner, e.segment_name, e.segment_type
           FROM dba_extents e,
                (SELECT *
                   FROM (SELECT   addr, ts#, file#, dbarfil, dbablk, tch
                             FROM x$bh
                         ORDER BY tch DESC)
                  WHERE ROWNUM < 11) b
          WHERE e.relative_fno = b.dbarfil
            AND e.block_id <= b.dbablk
            AND e.block_id + e.blocks > b.dbablk;



6 SHARD POOL的基本原理:
     通过shard pool实现SQL共享,减少代码硬解析等,从而提高数据库的性能。包括了库缓存(v$librarychace视图,
保存了SQL语句执行计划,执行的代码块等)
,数据字典缓存(v$rowcache)查询。
   从11G开始多了一个result cache memory,主要是将查询的结果集缓存起来,如果同一SQL多次执行,就把结果直接返回。

服务端的result cache memory由两部分组成:sql query result cache,存储SQL查询的结果集
通过参数result_cache_max_size设置大小,如果=0,则禁止该特性。
  设置有auto(自动),manual(通过查询hints判断),设置force(尽可能缓存)结果
比如
    select /*+ result_cache */ ...............
   查看cache 使用情况
    select * from v$result_cache_memory where free='no';
查询result cache的统计信息
     select * from v$result_cache_statisitcs;

7 oracle 9i中,增加了子缓冲池的管理,shared pool划分为多个子缓冲池,9I中每个子缓冲池至少为128MB,SUBPOOL
最多有7个;在10G中,每个子缓冲为256MB,每4个CPU分配一个子缓冲。11G中,每个至少为512MB

8 oracle中,如果SQL语句大小写不同,也会认为是不同的SQL,不会重用

9 ORA-04031错误:当尝试分配大块连续内存失败(碎片过多),先清除共享池中当前没用的所有对象,是空闲块合拼,如果
依然没足够内存满足需要,产生该错误

10 查询硬解析次数
  1)select name,value from v$mystat a,v$statname b where a.statist