在v$sysstat资料视图中,session logical reads记录了所有逻辑读,同时这个资料就是AWR报告中load profile中的 logical reads数据。
逻辑读又被细分为一致读(consisten read)和当前读(db block get),也可以在v$sysstat里找到。其中一致读针对select操作,当前读针对DML和DDL操作,简单来说一致读是纯粹的读,当前读是为了修改而产生的读操作(修改数据得先访问数据)。
区分两种读主要是看buffer pin锁的模式,下面是对应关系:
共享buffer pin锁—— 一致读,一致读模式
独占buffer pin锁—— 修改操作(逻辑写),修改模式
类似共享模式buffer pin锁—— 当前读,当前读模式
一致读和当前读的区别就是他们两个加的锁不同而已。
当前读模式:
当前读模式就是服务进程在修改一个buffer的某行数据前,会先加一个当前读模式的锁,然后去找到这个行的位置。
修改模式:
修改buffer的某行数据时,在定位到这个行的位置后,会释放掉当前读模式的锁,转而加一个修改模式的buffer pin锁。
对于DML的当前读模式的锁和select的一致读模式的锁,不会互相堵塞;而对于DML的当前读模式的锁和DDL的当前读模式的锁会互相堵塞。这是为了还处于定位修改行位置的DML操作,不会堵塞select,却可以堵塞其他的DML操作。