日期:2014-05-16  浏览次数:20690 次

通过对oracle内存(SGA和PGA)进行调整,优化数据库性能
一、示例:
_______________________________________________________________
SGA:
     共享池:200MB          
     缓冲区高速缓存:24MB   
     大型池:9MB
     Java池:32MB

     SAG总容量:264.933
     SAG的最大大小:305.069

PGA:
     总记PGA目标:240MB     
     分配的当前PGA:8914KB
     分配的最大PGA(自启动以来)9081KB
     高速缓存命中百分比:100%

     PGA和SGA的和应小于系统内存总量前去操作系统和其他应用程序所需内存后得到的值。


_______________________________________________________________

二、名词解释:
_______________________________________________________________
SGA:System Global Area是Oracle Instance的基本组成部分,在实例启动时分配;
      系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。
      共享池:Shared Pool用于缓存最近被执行的SQL语句和最近被使用的数据定义,
          主要包括:Library cache(共享SQL区)和Data dictionary cache(数据字典缓冲区)
          共享SQL区是存放用户SQL命令的区域,数据字典缓冲区存放数据库运行的动态信息
      缓冲区高速缓存:Database Buffer Cache用于缓存从数据文件中检索出来的数据块,可以大大提高查询和更新数据的性能
      大型池:Large Pool是SGA中一个可选的内存区域,它只用于shared server环境
      Java池:ava Pool为Java命令的语法分析提供服务
PGA:Program Global Area是为每个连接到Oracle database的用户进程保留的内存。

_______________________________________________________________

三、分析与调整:
_______________________________________________________________
      1、系统全局域:
         SGA与操作系统、内存大小、cpu、同时登录的用户数有关。可占OS系统物理内存的1/2到1/3,当然,如果服务器上只有oracle的话,

可以分配的更大一些,如果还有其他服务,如IIS等,那就要分的小一些。
      1、共享池:
         修改共享池的大小,ALTER SYSTEM SET SHARED_POOL_SIZE = 64M;
         查看共享SQL区的使用率:
             select(sum(pins-reloads))/sum(pins) "Library cache" from v$librarycache;--动态性能表
             这个使用率应该在90%以上,否则需要增加共享池的大小。
         查看数据字典缓冲区的使用率:
             select (sum(gets-getmisses-usage-fixed))/sum(gets) "Data dictionary cache" from v$rowcache;--动态性能表
             这个使用率也应该在90%以上,否则需要增加共享池的大小。
      2、缓冲区高速缓存:
         它的大小要根据数据量来决定:
              SGA=((db_block_buffers * block size)+(shared_pool_size+large_pool_size+java_pool_size+log_buffers)+1MB
         查看数据库数据缓冲区的使用情况:
             SELECT name,value FROM v$sysstat order by name WHERE name IN('DB BLOCK GETS','CONSISTENT GETS','PHYSICAL READS');
         计算出来数据缓冲区的使用命中率=1-(physical reads/(db block gets+consistent gets)),这个命中率应该在90%以上,否则需要

增加数据缓冲区的大小。
         select sum(pins) "请求存取数",sum(reloads) "不命中数",sum(reloads)/sum(pins) from v$librarycache 
      其中,pins,显示在库高速缓存中执行的次数;reload,显示在执行阶段库高速缓存不命中的数目,一般sum(reloads)/sum(pins)的

值应接近于零.如果大于1%就应该增加shared_pool_size的值, 来提高数据字典高速缓存可用的内存数量,减少不命中数.
    &nb