脏数据的定义:比如说甲和乙,都在用同一个银行帐号,两人查询到帐号现在有100元。然后甲取走这100元,乙没有刷新,看到帐号还是有100元,乙看到的是脏数据。 脏数据就是已经写入到内存里,但是还没有写入到硬盘上的数据。一般当事物没有提交的时候会产生,当事物提交以后,脏数据就会被写进硬盘的数据块,这时他就不叫脏数据了。 ***********************************************************************************************
我们经常看可以看到执行计划中统计分析部分有consistent gets和db_block_gets,这两个合起来统称为我们经常说的逻辑读,也就是从oracle buffer cache中读到的数据。-
创建我们的测试表tbl2,tbl3
-
consistent_gets是从回滚段中读到的前映(或叫读取一致性影象), 看见的数据是查询开始的时间点的,所以若存在block在查询开始后发生了变化的情况,则必须产生 before image 然后读数据,这就是一致读的含义
一般查询就是表示 consistent gets (query mode),因为查询要保证所获取的数据的时间点的一致性,所以叫一致读,即使是从当前 buffer 获得的数据,也叫 consistent gets ,这仅仅表达一种模式一种期望,并不表示真实的是从 当前buffer 获得 还是从回滚段获取数据产生的 bufore image 。
看下图,我们只执行了查询我们刚才创建tbl2表,可以看到产生的都是consistent_gets
-
db block gets : 又叫current mode , 不管这个块上的数据是否可能存在 before image ,也就是说不管是否存在回滚数据,只看见当前最新块的数据,即使别人正在更新,也看不见别人更新状态的数据,比如dml的时候就不需要看见别人更改前的数据,而是看见正在更改的,当然同时,若操作相同数据则被lock住。也就是说一次查询中看见的数据可能不在同一个时间点上,比如一个大的dml,当dml 开始更新一个非常大的表后,这个表更新的过程中,有一个进程去把该表末尾的一个记录更新了,然后这个大更新抵达该记录的时候会被阻塞的,若该进程事物提交,则大更新会覆盖该事务的更新,也就是说,这个大更新所看见的数据是当前的,不具有时间点的一致性,所以叫 current mode。
我们通过向tbl3表中插入数据,可以看到统计分析中产生了consistent gets和db block gets,consistent gets由select产生,db block gets由insert产生
-
下面我们删除掉tbl3数据
-
我们再来执行一个insert,通过下图可以看到,因为我们的查询没有检索到数据,所以产生了大量consistent gets,而db block gets几乎可以忽略不计。




