数据库缓冲区命中率

数据库缓冲区命中率通常就是由以下五部分组成:
 
      1  physical reads(从数据文件读)
 
      2  physical reads direct(从缓冲区读(不含LOBS))
 
      3  physical reads direct(lob)(从缓冲区读(包含LOBS))
 
      4  db block gets(在当前读模式下所读取的数据块数)
 
      5  consistent gets (在一致性读模式下所读取的数据块数,包括从回滚段中读取的数据块)
 
      4+5 = logical reads(逻辑读的次数)
 
   公认的方法应该是
   Cache hit rate= 100 - (pyhsical reads - physical reads direct - physical reads direct(lob)) / (consistent gets + db block gets - physical reads direct - physical reads direct(lob)) *100
 
    因此,使用
 
select 'DEFAULT' BUFFER_POOL_NAME, 
sum(DECODE(NAME,'session logical reads',value,0)) Consistent,
sum(DECODE(NAME,'physical reads',value,0)) physrds,
sum(DECODE(NAME,'physical reads direct',value,0)) physrdsdir,
sum(DECODE(NAME,'physical reads direct(lob)',value,0)) physrdslob,
ROUND(((sum(DECODE(NAME,'session logical reads',value,0))- sum(DECODE(NAME,'physical reads',value,0)) 
+sum(DECODE(NAME,'physical reads direct',value,0)) +sum(DECODE(NAME,'physical reads direct(lob)',value,0)))/
(sum(DECODE(NAME,'session logical reads',value,0))))*100,2)
HITRATIO from V$SYSSTAT;
  进行统计,应该更为准确。
 
  而,从以下SQL中得到的统计一般都很低。
select name, ((consistent_gets + db_block_gets) - physical_reads) /
(consistent_gets + db_block_gets) * 100 "Hit Ratio%"
from v$buffer_pool_statistics
where physical_reads > 0;
 
 http://blog.sina.com.cn/s/blog_4b06743c0100aavz.html 这篇日志中,grssbell版主提供的方法却是第二种,也不明白到底为啥这么低,按道理差别应该不大的。先记录一下,以后再研究吧。(环境是ORACLE 10.2.0.4)
     
    数据库缓冲命中率表示在不需要进行磁盘访问的情况下,在内存中直接能找到常用数据块的频率。通常>90%被认为是比较合理的数据库。如果低于这个值,也不一定就是某方面出现了问题。
   
    基于比率来调优的方法早就不再推荐了,特别是基于数据缓冲区命中率。
   
    如果一定要在这个命中率上进行优化,可以参考以下几点:
 
    1. 调整db block size,基本上这个是无法操作的,创建数据库之后就决定了数据块的大小。
 
    2. 调整db cache size,调整缓冲区池,比如增大缓冲区池,这取决于机器的内存,以及SGA的大小。(一般占SGA 45%比较合理)
 
    3. 使用多个缓冲池(将某些经常用的表分配给保持区,使其在内存中保留)
 
    4. 在内存中cache table, 一般只是针对小表。
 
 
    对于一个典型的OLTP应用来说,这个命中率还能作为一个参考,但是对于OLAP,缓冲区命中率要是能达到90%很难。
 
    优化要结合环境,综合考虑,找出瓶颈所在,而不是根据手册上的数据来追求硬性达标。
请使用浏览器的分享功能分享到微信等