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'。
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/