您的位置:首页 > 数据库 > Oracle

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

2010-02-05 09:48 211 查看
评估数据高速缓存效率的指标是命中率。该命中率通过查询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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: