有两种读:逻辑读和物理读
数据库读写的单位是数据块.当用户最终得到的结果可能只是某个数据块中的几行或几列.当一个查询语句被执行时,服务器进程会将相关的数据块从数据文件中写入内存(buffer cache).这就叫做物理读.每读取一个数据块,即是一次物理读.
而用户需要的并不是整个数据块,而是其中的几行或几列.从buffer cache中提取行的过程,便是逻辑读.
而其中逻辑读又分成两种:即时读(current read)和一致性读(consistent read).
(1)即时读::即时读就是读取数据块当前的最新数据.任何时候在buffer cache中都只有一份当前数据块.即时读通常发生在对数据进行修改,删除操作时.这时,进程会给数据加上行级锁,并且标识数据为"脏数据".
一致性读就是为了保证数据的一致性.在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN.
如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为"脏"数据.
当其他进程读取数据块时,会先比较数据块上的SCN和自己的SCN.如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;
如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据.通常,普通查询都是一致性读.
综合上面所讲的,逻辑读的原理和过程比较复杂.逻辑读的单位并不能简单的认为是个块.
① 物理读
这个很容易理解,cpu需要的数据在内存中找不到,那么此时必须去物理磁盘上获取,必然产生物理i/o.
反应在oracle中,就是会话需要某条数据时,在内存的buffer cache中中没有,此时就要去磁盘上的dbf文件中读取.就产生物理读.
这个概念是最清晰,但同时又是最模糊的.
按照计算机原理来讲,逻辑读,表示cpu需要的数据在内存中被找到,数据被直接从内存中传入cpu执行.
按照tom大师的描述:
当前读(Current read):得到块来实际更新所要修改的行时,所完成的获取就是当前读.
这么话怎么理解?
A:读块的时候要加锁.如果读块的目的是为了定位行、然后修改,这时加的锁和纯读的锁并不一样,虽然它们两个都是读操作.
因为加的锁不同,就有了当前读和一致读.
一致读(Consistent read):"发现"要修改的行时,所完成的获取就是一致读.
A:一致读和当前读放在一起时,一致读指的纯读.
这个概念,无庸置疑.
读一致性:Oracle在需要时会使用undo数据来构造CR块,从而提供非阻塞的查询.
以上就是土嘎嘎小编为大家整理的oracle逻辑读怎么算相关主题介绍,如果您觉得小编更新的文章只要能对粉丝们有用,就是我们最大的鼓励和动力,不要忘记讲本站分享给您身边的朋友哦!!