数据缓冲区的命中率

Oracle文档:

db block gets: Accesses to the current image of a block
consistent gets: Accesses to a read-consistent image of a block
physical reads: Number of blocks read from disk

Hit Ratio = 1 – (physical reads/(db block gets + consistent gets))

我的理解:
db block gets: 获取数据的当前映像所读取的数据块。
Oracle为了获取数据的当前映像,会先去数据缓存(Data cache)中找,如果有就直接读取(逻辑读),如果没有再去数据文件中读取(物理读)。

consistent gets: 获取数据的读一致性映像所读取的数据块。
应该仅发生在用户查询时该数据块正在被修改的情况下,则数据的前映像在回滚段中,Oracle为了获取一致性映像,必须从回滚段中读取(物理读)。

physical reads: 所有物理读的总数。

从而: db block gets + consistent gets 就是所有读取操作涉及的数据块

则物理读在所有读操作中所占的比例就是:

physical reads/(db block gets + consistent gets)

数据高速缓存的命中率就应该是:

Hit Ratio = 1 – (physical reads/(db block gets + consistent gets))

明白了,总结如下,大家看对不对
(1)buffer_gets=db block gets + consistent gets = LOGIC IO(逻辑读次数)
(2)consistent get : 在一致读模式下所读的快数,包括从回滚段读的快数。 
  db block gets : 在当前读模式下所读的快数,比较少和特殊,例如数据字典数据获取,在DML中,更改或删除数据是要用到当前读模式。
(3)db block gets : current mode , 不管这个块上的数据是否可能存在 before image ,也就是说不管是否存在回滚中数据可以 回滚,只看见当前最新块的数据,即使别人正在更新,也看见别人更新状态的数据,比如dml的时候就不需要看见别人更改前的数据,而是看见正在更改的,当然同时,若操作相同数据则被lock住。也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode,个人认为db block gets这个词用的不好, 容易让人误解. 如果改成inconsistent gets可能会更准确一些

consistent gets :consistent_gets是从回滚段中读到的前映(或叫读取一致性影象), 看见的数据是查询开始的时间点的,所以若存在block在查询开始后发生了变化的情况,则必须产生 before image 然后读数据,这就是一致读的含义
查询就是表示 consistent gets (query mode),因为查询要保证所获取的数据的时间点的一致性,所以叫一致读,即使是从当前 buffer 获得的数据,也叫 consistent gets ,这仅仅表达一种模式一种期望,并不表示真实的是从 当前buffer 获得 还是从回滚段获取数据产生的 bufore image 。
 
 
 
 

猜你喜欢

转载自www.cnblogs.com/elikun/p/10118508.html