一个 db block gets是一个current mode get.这是现在或者最近的数据块中最新的copy。
在buffer cache中任何时候只能有一个block的copy。 Db block gets是发生通常是:DML改变database中的数据的时候。在这种情况下row-level的锁会隐式的加载在正在被更新的rows上。
当select语句执行一个db block gets的时候,最少有一个well-knowncase,,而且不会产生lock。
当执行一次全表扫描或者全索引扫描的时候,oracle会读取segment的header以 current mode(多次读取,取决于oracle版本)。
Current mode:
Oracle获得block用两种方式:current或者consistent
Consistent get是当oracle得到一个block(一致性的block,有一个给予的时间点或者SCN)
一致性得到是oracle一致性读机制的核心。为了完成查询结果,block会被拿出来,它们被取出来在一致性模式上。如果在buffer cache中的block和正确的point不一致的话,oracle会使用rollback sgement中的信息重建block。如果失败的话,这就是会产生错误。
(为什么buffer cache中的block和正确的point不一致?)
Current mode 是相对于query mode来说的,current mode产生db block gets,一般是在DML的时候产生
Query mode 产生 consistent gets,一般在查询的时候产生,,总和一般称为逻辑读,logicalread。
Current mode是当前读到的是什么数据就是什么数据,
一致性模式是:从开始到结束读到的数据都是同一个时间点内
Select is query mode
And DML like insertupdate delete is consistent mode
Oracle 读一致性
Consistent read:如何实现:
Oracle逻辑读:是从内存,确切的说是从:SGA中的buffer cache中取出东西来
Logical read,又分为:db block gets ,consistentgets
Db block gets 是DML执行的时候,在内存中读取的东西,还涉及到oracle的undo segment
而consistent gets是,select执行的时候,因为不会产生数据变化,所以说是直接从oracle的buffer cache 中取出东西来就OK了
What the fuck is going on?
What the hell is going on?
Where is the truth?
转载于:https://blog.51cto.com/yuangeqingtian/1364248