.示例说明consistentread,current read,logical read,physical read的概念及关系
Logical read:所谓逻辑读,就是从内存中读取数据块,包含current read 与 consistent read
current read:属于Oracle版本读取方式的一种机制,就是说当进行DML操作时,我们需要获取数据块最新的状态,只对最新状态进行操作,操作期间锁定数据行。
consistent read:当进行select查询时,我们需要获取查询那一刻数据块状态,不管查询了多长时间,我们只要查询那一瞬间的结果,如果查询期间数据块被修改,那么我们就去undo segment读取旧映像来呈现。
公式:logicalread=db block gets(current read) + consistent gets(consistent read)
Physical read:所谓物理读,就是从磁盘中读取数据块
如果想了解更多的currentread 和 consistent read的信息请参考如下链接
《Oracleundo我们需要掌握什么》 第五小题“示例分别说明什么是consistentread和currentread?”
http://space.itpub.net/26686207/viewspace-757488
LEO1@LEO1> drop table leo2 purge; 清空环境
Table dropped.
LEO1@LEO1> create table leo2 as select * fromdba_objects; 创建leo2表
Table created.
LEO1@LEO1> set autotrace traceonly
LEO1@LEO1> select count(*) from leo2; 查看一下SQL语句统计信息
Statistics
----------------------------------------------------------
28 recursivecalls
0 db block gets
1100 consistent gets 逻辑读中一致性读,发生了1100次(从内存中读取数据块)
1025 physical reads 物理读发生了1025次(从磁盘中读取数据块)
0 redo size
528 bytes sentvia SQL*Net to client
524 bytes receivedvia SQL*Net from client
2 SQL*Netroundtrips to/from client
0 sorts(memory)
0 sorts (disk)
1 rowsprocessed
逻辑读与物理读关系:逻辑读触发物理读的发生,因为oracle默认数据块在内存中,如果发现块不在内存里,就会触发物理读从磁盘上读取数据块到内存,在进行下面的逻辑读。
有物理读必有逻辑读,有逻辑读不一定有物理读,看看下面的样子
LEO1@LEO1> select count(*) from leo2;
Statistics
----------------------------------------------------------
0 recursivecalls
0 db block gets
1030 consistentgets 只有逻辑读1030次
0 physicalreads 没有物理读
0 redo size
528 bytes sentvia SQL*Net to client
524 bytesreceived via SQL*Net from client
2 SQL*Netroundtrips to/from client
0 sorts(memory)
0 sorts (disk)
1 rowsprocessed
原因:数据块现在已经全部缓存到内存中了,我们从内存中读取块即可,不用再从磁盘中读取块了,自然就没有物理读。