DB Block Gets、Consistent Gets、Physical Reads

db block gets:Number of times a CURRENT block was requested.
consistent gets:Number of times a consistent read was requested for a block.
physical reads:Total number of data blocks read from disk. This number equals the value of "physical reads direct" plus all reads into buffer cache.
--------------------------------------------- --------------------------------------------- ---------------------------

针对以上3个概念进行的说明解释及关系如下:

1、DB Block Gets(当前请求块的读取次数,单位是块/次,DML才会产生
current mode
当前块就是在查询开始的那个时间点上存在的数据块,而不是在这个时间点之前或者之后的数据块数目。
以当前读到块的时间为基准,主要是DML操作(U,I,D),即使数据在DML操作开始时的SCN之后被提交的,也会一直等这个提交完成

current mode就是当看到当前的block中的内容的时候,是什么就是什么,跟时间点无关,不用去回滚段获取之前的数据。主要就是发生在DML 的时候,当发生DML的时候,session所看见的必须是当前的block的状态,不能去回滚段获取数据。假如当前block中数据是被其他的session更改过还没有提交,那么则看到当前状态数据被其他session 锁定,出现等待。(而查询去回滚段获取数据则读和更新之间不会出现锁的情况)

也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode。数据字典的读也是 current mode.


2、Consistent Gets(一致性读所需要的数据块的读取次数,单位是块/次,select才会产生
consistent mode 
一致性读块就是在查询开始的那个时间点的数据块+这个时间点以前存在的已提交的数据块。
也就是说,当查询开始的时候oracle将确立一个时间点,凡是在这个时间点以前提交的数据oracle将能看见,之后提交的数据将不能看见。但查询的时候可能遇上这样的情况,该块中数据已经被修改了,没有提交,或者提交的时间点比查询开始的时间晚,则oracle为了保证读的一致性,需要去回滚段获取该块中变化前的数据。这叫 consistent reads 。

比如你查询的过程中,由于其他会话对数据块进行操作,而对所要查询的块有了修改,但是由于我们的查询是在这些修改之前调用的,所以需要对回滚段中的数据块的前映像进行查询,以保证数据的一致性。其中可能包括undo block,也有包括非undo block,而非undo block则就是buffer cache block。

读取一个数据块,则这个数据块要么直接来自datafile,要么来自Buffer Cache,如果来自datafile,则也要读取到SGA的Buffer Cache中,也就是一次物理读必然产生一个逻辑读的意思数据块上都会有最后一次修改数据块后commit的SCN
如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN,然后再更新Buffer Cache中的数据块的数据,如果没有commit则标记段头部的TIL,如果已经commit则把commit后的SCN更新到数据块上。当其他进程读取数据块时,会先比较数据块上的SCN和自己的SCN。如果数据块上的SCN 小于等于进程本身的SCN,则直接读取数据块上的数据;如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。
Oracle的一致性读的理解:一个语句在读取数据快时,如果发现这个数据块是在它读取的过程中被修改的(数据块上的SCN 大于等于读取进程本身的SCN),就不直接从数据块上读取数据,而是从相应的undo中读取数据。这就保证了最终结果应该是读操作开始时的那一时刻的快照 (snapshot),而不会受到读期间其他事务的影响。当然如果放在undo里面的数据被覆盖了,就报错OR会A-01555:快照过旧

经过初步试验,发现如果开始运行select * from emp后,然后再运行select * from emp where empno = 7902, 不管运行多少此,都不会引起physical reads与db block gets的增加。


逻辑读(consistent gets+db block gets)和每批次处理的数据行的大小是有一定关系的。每批次处理的数据行越大,则逻辑读越小。所以减少逻辑读的一个方法就是增加arraysize


3、Physical Reads(物理读)
就是从磁盘上读取数据块的数量,其产生的主要原因是:
1、 在数据库高速缓存中不存在这些块
2、 全表扫描
3、 磁盘排序



它们三者之间的关系大致可概括为:
逻辑读指的是Oracle从内存读到的数据块数量。一般来说是'consistent gets' + 'db block gets'。当在内存中找不到所需的数据块的话就需要从磁盘中获取,于是就产生了'phsical reads'。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30126024/viewspace-2132029/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30126024/viewspace-2132029/

微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码 微信小程序毕业设计期末大作业项目源码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值