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;
(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%很难。
优化要结合环境,综合考虑,找出瓶颈所在,而不是根据手册上的数据来追求硬性达标。