技术开发 频道

Oracle数据库优化之系统全局区(SGA)

  优化数据库缓冲区高速缓存:

  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的内存需求也会改变。

  减少整个内存使用

  采用如下方法:

  增加可用内存总数;

  减少内存使用

0
相关文章