逻辑IO
逻辑读(确切是指db get之read不是consistentget之read):就是服务器进程从SGA上的buffercache(高速缓存)区域(先)根据SQL语句解析过程所获得的要操作的数据块的地址找到相关的数据块(后,再)读取这些相关的数据块上的相关数据行,到该服务器进程的PGA内存上,这就是一次逻辑读。简单地说,就是一次从buffer cache读取内容到PGA内存上的过程。
注释:
首先,这些数据块指的是在buffer cache上的数据块,也就是在内存上的数据块。若是服务器进程发现在buffercache上找不到服务器进程想要的数据块,服务器进程就会根据该数据块的地址从磁盘的数据文件上将之读取到buffercache上来,这就是一次物理读,然后再从buffercache上将该数据块读取到该服务器进程的PGA内存上,这就是一次逻辑读(这个不算做一次逻辑读,一次逻辑读特指一次从buffercache读取内容到PGA内存上的过程)。
接着,逻辑读过程中,如果服务器进程从SGA上的buffer cache(高速缓存)区域上找到的某一个数据块上有很多行要读取时,可能就会一次读取不完,要多次逻辑读,这个取决于参数arrysize(即一次逻辑读读取几行数据行)。物理读不知道有这个限制否?
最后一点是,select操作要使用逻辑读,它从buffer cache读取内容到PGA内存上自己的结果集中,再发给客户端。
(姑且认为有一种逻辑写的概念,那么)逻辑写(确切是指db get之write,不是consistent get之write):就是服务器进程从SGA上的buffercache(高速缓存)区域(先)根据SQL语句解析过程所获得的要操作的数据块的地址找到相关的数据块(后,再)修改这些相关的数据块上的相关数据行的内容,这就是一次逻辑写。
注释:
DML操作要使用逻辑写,它在buffer cache上修改相关的数据块上的相关数据行的内容。
逻辑读和逻辑写共同一步骤:
都是要根据SQL语句解析过程所获得的要操作的数据块的地址找到相关的数据块。
逻辑读和逻辑写不同一步骤:
之后,逻辑读是读取这些相关的数据块上的相关数据行到该服务器进程的PGA内存上,而逻辑写是修改这些相关的数据块上的相关数据行的内容。
或者另外一种理解是说,
逻辑读就是根据SQL语句解析过程所获得的要操作的数据块的地址找到相关的数据块的过程。
姑且认为有一种逻辑写的概念,那么逻辑写就是是修改这些找到的相关的数据块上的相关数据行的内容的过程。
注释:
逻辑读包括当前模式读( current read)和一致性读(consistent read)两种情况。
在oracle中,没有所谓逻辑写的概念。逻辑读既是读数据块也是写数据块的意思。见于《oracle性能诊断艺术》2.4读写数据块。
======================================================================================
什么是当前模式(Current Mode)?或者说什么是当前模式读( current read)?
当发生修改数据操作时,Oracle从buffer cache中,找到被修改数据行所在的数据块的过程,就是所谓的当前模式读 的过程。也就是说当前模式读的前提是发生在修改数据(DML)操作的情况下的。由当前模式读出来的数据块就是为了被修改的。而修改数据(DML)操作的第一步是一致性读的过程,第二步才是当前模式读的过程。
总之,DML操作(即修改数据的操作)的第二步过程才是