优化数据库缓冲区高速缓存:
select name,value from v$sysstat where name in ('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 block gets + consisten gets))
若命中率低可以加大INITXXX.ORA中DB_BLOCK_BUFFER的值。
调整多缓冲池
多缓冲池特性概述
可以使用keep缓冲池来维护缓存中的实体,使用recycle缓冲池来防止实体占用缓存中不必要的空间;
可以将大的数据段置于独立的recycle缓存中,将小的数据段置于独立的keep缓存中。
何时使用多缓冲池
1. 查找oracle内部实体数据段的数目:
select data_object_id,object_type from user_objects where object_name=’
2. 查找对应该段名的缓存中的缓冲区数:
select count(*) buffers from x$bh where obj=
3. 查找实例中的缓冲区总数:
select value “total buffers ” from v$parameter where name=’db_block_buffers’ ;
4. 计算当前有指定段使用的缓存所占的比率:
%cache used by segment_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}
如何为各缓冲池设置大小
1. KEEP缓冲池
使用keep缓冲池的目的是将实体保留在内存,避免I/O操作
select physical_reads,block_gets,consistent_gets from v$buffer_pool statistics where name=’KEEP’;
计算缓冲池命中率的公式:Hit Ratio=1-physical_reads/(block_gets+consistent_gets)
2. Recycle缓冲池
使用recycle缓冲池的目的是为了清除内存中的不再使用的数据块,如果“free buffer waits”统计数总是很高,可以确定recycle缓冲池过小:
确定recycle缓冲池大小的办法:使recycle缓冲池失效运行系通到稳定状态,查看default缓冲池中由本来需要置于recycle缓冲池中数据段的缓冲区数,除以4,该结果就可以用作recycle缓冲池的大小。
3. 确定数据段置于keep还是recycle缓冲池
对于至少两倍DEFAULT缓冲池大小,并且占用系统整个I/O的一定百分比的数据段,那么最好放置于recycle缓冲池;
对于大小小于DEFAULT缓冲池的10%,并且占用至少系统整个I/O的1%的数据段,那么最好放置于keep缓冲池;
如果对表空间超过一个段时,可以通过查询V$SESSION_WAIT确定每个段的I/O操作。
如何识别和减少LRU Latch竞争
LRU latches规划了那些缓存中最近最少使用的缓冲区列表,使用DB_BLOCK_LRU_LATCHES参数可以设置数据库实例中的latches总数。
可以通过如下语句确定系统中是否有latch竞争:
select child#,sleeps/gets ratio from v$latch_children where name=’cache buffers lru chain’ ;
每个LRU latch的非命中率应少于1%,任何大于1%的latch说明存在竞争,通过如下语句查找出来:
select name from v$buffer_pool_statistics where lo_setid<=child_latch_number and hi_setid>=child_latch_numbers ;
通过增加系统的LATCHES总数和相关缓冲池的LATCHES数可以减少LRU latch竞争。所允许的LATCHES最大值应少于:number_of_cpus*2*3和number_of_buffers/50
调整排序区
如果经常进行大的排序,应增大参数SORT_AREA_SIZE的值,将参数SORT_AREA_SIZE和SORT_AREA_RETAINED_SIZE联合使用,更有利于使用大的排序区。
重新分配内存
在重新定义了oracle内存结构、调整了库快存、数据字典快存和快速缓存后,如果减少了这些结构中某一个结构的内存使用,就可能需要将内存分配到其他结构中;
在改变了oracle内存结构以后,oracle的内存需求也会改变。
减少整个内存使用
采用如下方法:
增加可用内存总数;
减少内存使用