ORACLE数据库学习之数据库的优化(五)

2014-11-24 17:07:31 · 作者: · 浏览: 4
otal memory for all sessions

--------------------------------------

157125 bytes

结果指明当前分配给所有会话的内存。

调整共享池的保留空间

shared_pool_reserved_size为大的存储保留的shared_pool_size总量;

shared_pool_reserved_min_alloc-控制保留内存的分配;

要创建一个保留列表,shared_pool_reserved_size必须大于shared_pool_reserved_min_alloc。

优化共享池:
用以下语句检测命中率:

selectsum(pins)"pinned",sum(reloads)"reloaded" fromv$librarycache

pinned reloaded

---------- ---------

2474 17

命中率=pinned/reloaded

若命中率低可增大INIT.ORA中SHARED_POOL_SIZE的值。

调整快速缓存

利用缓存的命中率评价快速缓存的活动

select name,value from v$sysstat where name in (‘dbblock gets’,’consistent_gets’,’physical reads‘);

db block gets,consistent_gets其和为数据请求总数,physicalreads为数据请求导致访问磁盘数据文件的总数。

增加db_block_buffers应该遵循如下规则:

缓存命中率低于0.9;

前面增加的db_block_buffers有效

提高缓冲区命中率

如果缓冲命中率低,如小于60%或70%,那么需要增加缓冲区中的缓存数。方法是增大db_block_buffers的值。

表v$recent_bucket的每一行反映在缓存中增加一个缓冲区的相应性能值,其中rownum列比可能增加到缓存的缓冲区数小1;count列通过增加缓冲区数rownum+1到缓存,增加的缓冲区命中。

查询v$recent_bucket视图:select sum(count) ach from v$recent_bucket where rownum<20 ;

使用如下公式计算命中率(ACH为增加的命中次数):HitRatio=1-(physical reads-ACH/(db block gets+consistent gets) );

组合v$recent_bucket视图中的行,使用如下语句:select 250*TRUNC(ROWNUM/250)+1||’to’||250*(TRUNC(ROWNUM/250)+1) “Interval”,sum(count)”BufferCache Hits” from v$recent_bucket group by trunc(ROWNUM/250) ;

在命中率高时,删除不必要的缓存

减少参数DB_BLOCK_BUFFERS的值可以使缓存变小,(最小值为4)。

视图v$CURRENT_BUCKET包含对一个小缓存的性能统计,其列描述如下:

ROWNUM—缓存中可能的缓冲区数

COUNT—对缓冲区数ROWNUM的缓存命中数

初始参数DB_BLOCK_LRU_STATISTICS控制视图V$CURRENT_BUCKET的统计,默认值为FALSE,意味着不收集统计数据。将其设置为TRUE,视图V$CURRENT_BUCKET将收集统计。

查询V$CURRENT_BUCKET视图,如果当前缓存为100,如果想知道在90时,缓存非命中的增加数,使用如下语句:

SELECTSUM(COUNT) ACM FROM V$CURRENT_BUCKET WHERE ROWNUM>=90 ;

计算命中率(ACM为增加的非命中次数):HitRatio=1-(physical reads + ACM/(db block gets+consistent gets));

也可以将100个缓冲区分为4个25个缓冲区段:

select25*TRUNC(ROWNUM/25)+1||’to’||25*(TRUNC(ROWNUM/25+1)”Interval”,sum(count)”BufferCache Hits” from v$CURRENT_BUCKETwhere rownum>0 group byTRUNC(ROWNUM/25));

其中INTERVAL为缓冲区段,BUFFER CACHE HITS为对应段的缓存命中率。

优化数据库缓冲区高速缓存:
select name,value from v$sysstat where namein ('db block gets','consistent gets','physical reads') ;

NAME VALUE

------------------------- ---------

db block gets 3700

consistent gets 17603

physical reads 523

计算公式:

Hit Ratio = 1-(physical reads / ( db blockgets + consisten gets))

若命中率低可以加大INITXXX.ORA中DB_BLOCK_BUFFER的值。

调整多缓冲池

多缓冲池特性概述

可以使用keep缓冲池来维护缓存中的实体,使用recycle缓冲池来防止实体占用缓存中不必要的空间;

可以将大的数据段置于独立的recycle缓存中,将小的数据段置于独立的keep缓存中。

何时使用多缓冲池

1.查找oracle内部实体数据段的数目:

selectdata_object_id,object_type from user_objects where object_name=’’;

2.查找对应该段名的缓存中的缓冲区数:

selectcount(*) buffers from x$bh where obj= ;

3.查找实例中的缓冲区总数:

select value “totalbuffers ” from v$parameter where name=’db_block_buffers’ ;

4.计算当前有指定段使用的缓存所占的比率:

%cache used bysegment_name=buffers(step 2)/buffers(step 3);

使用多缓冲池调节缓存

减少I/O操作;

隔离缓存中的实体;

限制实体在缓存中的一个部分

使多缓冲池生效

定义新缓冲池:使用初始参数BUFFER_POOL_NAME来定义缓冲池,每个缓冲池可以指定两个属性:缓冲池中的缓冲区数;分配该缓冲池的LRU latches数。

用于定义缓冲池的初始参数有:

BUFFER_POOL_KEEP-定义keep缓冲池

BUFFER_POOL_RECYCLE-定义recycle缓冲池

DB_BLOCK_BUFFERS-定义数据库实例的缓冲区数

DB_BLOCK_LRU_LATCHES-定义数据库实例的LRU latches数

Oracle8定义了三个缓冲池:keep,recycle和default。其中default缓冲池是已经存在的。

使用多缓冲池

为一个实体建立一个默认缓冲池,语法为:

BUFFER_POOL{KEEP| RECYCLE | DEFAULT}

如何