ORACLE调优之--多缓存池命中率(摘自文平书)

评估数据高速缓存效率的指标是命中率。该命中率通过查询V$SYSSTAT 和$BUFFER_POOL_STATISTICS视图可以得到。这个视图可以
查询每个缓存池各自的命中率。缓存池的命中率的计算采用下面的公式:

   1-(physical_reads/(db_block_gets+consistent_gets))

   下面的SQL语句常用来查询当前各个缓存池的命中率情况:
    SQL>select name,physical_reads,db_block_gets,consistent_gets,
        1-(physical_reads/(db_block_gets+consistent_gets))  "命中率"
        from v$buffer_pool_statistics;

SQL> select name,physical_reads,db_block_gets,consistent_gets,
  2          1-(physical_reads/(db_block_gets+consistent_gets))  "命中率"
  3          from v$buffer_pool_statistics;

NAME                 PHYSICAL_READS DB_BLOCK_GETS CONSISTENT_GETS     ??????
-------------------- -------------- ------------- --------------- ----------
DEFAULT                        3806          1541           44202 .916796013

 

通过对V$BH视图的查询可以获得当前存放在SGA中的所有数据块的块ID,下面列出了两种方法,用来找出数据库对象(表、索引等
段对象)占用数据缓存的状态,或者某个段使用缓存的情况。下列的查询语句列出了当前数据高速缓存中存放的所有数据块的段名,
以及该段在数据缓存中数据块的计数:


  SQL>select o.object_name OBJECT_NAME,count(*) number_of_blocks
        from dba_objects o,v$BH bh
        where o.data_object_id=bh.objd
        and o.owner  not in('SYS','SYSMAN')
        group by o.object_name
        order by count(*);


||||||||||||||||||||||||||||||||||

 

另一种查询可以从对象的角度查询缓存使用情况。下面的SQL语句查询了表MY_TABLE 使用了多少缓存块。

SQL>select count(*) "BUFFERS_BLOCKS",count(*)*8192/1024/1024 "BUFFERS_USED(M)"
    from V$BH
    where OBJD =
    (select data_object_id from dba_objects where object_name ='MYTABLE');

  BUFFERS_BLOCKS     BUFFERS_USED(M)
-----------------    --------------
983                  7.6796875

 

下面的语句查询了当前数据库系统多缓存池的配置情况:
SQL>select name "BUFFER POOL",BLOCK_SIZE ,SUM(BUFFERS) "TOTAL BUFFERS"
    from v$BUFFER_POOL
    GROUP BY NAME,BLOCK_SIZE
    HAVING SUM(BUFFERS)>0;
SQL> select name "BUFFER POOL",BLOCK_SIZE ,SUM(BUFFERS) "TOTAL BUFFERS"
  2      from v$BUFFER_POOL
  3      GROUP BY NAME,BLOCK_SIZE
  4      HAVING SUM(BUFFERS)>0;

BUFFER POOL          BLOCK_SIZE TOTAL BUFFERS
-------------------- ---------- -------------
DEFAULT                    8192         24451

 


保留池和循环池

   显然,最常用的数据应该长期保留在内存结构中。保留池的作用就是长期存放某些“热”的数据块,也就是说,你应该想办法找出你的系统中那些“热”的表,并将其绑定在保留池中。
   系统参数DB_KEEP_CACHE_SIZE定义了保留池的空间大小,其数据块尺寸为本系统标准的数据块尺寸。应该注意的是,保留池并不是
默认池的一个子集。因此配置时要注意其大小不应超出操作系统可以提供的容量。
   当遇到一个工程上的难题:业务数据库系统中有成百上千张表,还有成千上万个索引,究竟哪些表或索引应该放入保留池呢?


遴选规则如下:
该表中数据并不是很大
该表在SQL操作中被频繁调用
该表往往是数据库实体关系图中的中间表或参照表


和保留池的意义敲好相反,一些鲜有SQL操作的大表,其数据块并无必要长期保留在数据缓存中。
这时,我们可以通过设置循环池,将这些对象放入循环池。

循环池通过初始化参数DB_RECYBLE_CACHE_SIZE指定。同样地,循环池不是默认池的一个子集。下面的命令设置DB_KEEP_CACHE_SIZE初始化
参数,将保留池尺寸定位120MB:
SQL>alter system set db_keep_cache_size=120M scope=both;

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值