首页 > Oracle > Oracle buffer cache理解之七——统计信息!
2014
01-18

Oracle buffer cache理解之七——统计信息!

前文说了buffer cache的管理和DBWR进程是如何写文件的,更加具体的细节这里就不阐述了,这篇文章我们来了解一下关于buffer cache的统计信息,这里只介绍比较重要的几个统计信息参数:

1) session logical reads:所有的逻辑读的数据块的数量。注意,其中包括先从硬盘上读数据块到内存里,再从内存里读数据块。

2) consistent gets:在一致性(consistent read)读模式下读取的内存里的数据块数量。包括从rollback segment里读取的数据块数量以及从data block buffer里读取的数据块数量。主要是通过select产生的。Update/delete也能产生很少量的此类数据块。注意:如果oracle的运行时间过长,由于oracle的bug导致consistent gets大大超过实际的数量。因此建议使用‘no work – consistent read gets’, ‘cleanouts only – consistent read gets’,‘rollbacks only – consistent read gets’, ‘cleanouts and rollbacks – consistent read gets’之和来代替consistent gets的值。

3) db block gets:在当前(current)模式下读取的内存里的数据块的数量。不是读取过去某个时点的数据块,而必须是当前最新的数据块。主要是通过update/delete/insert来产生的,因为DML需要当前最新的数据块才能对之进行改变。在字典管理表空间下,一些获得当前可用扩展空间的select语句也会产生此类数据块,因为必须得到当前最新的空间使用信息才能扩展。逻辑上,session logical reads = consistent gets + db block gets。

4) physical reads:从硬盘里读取的数据块的数量。注意,这个数量大于实际从硬盘里读取的数量,因为这部分block也包括了从操作系统缓存里读取的数据块数量。

5) physical reads direct:有些数据块不会先从硬盘读入内存再从内存读入PGA再传给用户,而是绕过SGA直接从硬盘读入PGA。比如并行查询以及从临时表空间读取数据。这部分数据块由于不缓存使得hit ratio不会被提高。

6) physical reads direct (lob):与physical reads direct一样。

7) free buffer inspected:这个值表示为了找到可用数据块而跳过的数据块的数量。这些被跳过的数据块就是脏的或被锁定的数据块。明显,这个值如果持续增长或很高,就需要增加buffer cache的大小了。

当然这些信息也可以从AWR等报告中获取,在获得了这些统计信息之后,我们可以计算出buffer cache的命中率:

当然按照常理来说,命中率越高越好,说明sql执行效率高,但是如果需要调整命中率的时候,也不能盲目的进行调整,需要注意以下几点:

1) 如果上次增加buffer cache的大小以后,没有对提高hit ratio产生很大效果的话,不要盲目增加buffer cache的大小以提高性能。因为对于排序操作或并行读,oracle是绕过buffer cache进行的。

2) 在调整buffer cache时,尽量避免增加很多的内存而只是提高少量hit ratio的情况出现。

这些统计信息也反应了DBWR的运行情况,DBWR会基于被处罚的频率以及所处理的内存数据块的数量与总内存数据块的数量的比例来进行自我调整。

最后编辑:
作者:Jerry
一个积极向上的小青年,热衷于分享--Focus on DB,BI,ETL