欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  数据库

Oracle一致性读总结

程序员文章站 2024-01-11 11:18:22
...

什么是逻辑读? cpu在内存中读这些block的过程就叫做逻辑读(consistent get),在读的过程中产生的IO就是逻辑IO.逻辑读的过程中,是非

sql语句执行时,产生一致性读。

什么是逻辑读? cpu在内存中读这些block的过程就叫做逻辑读(consistent get),在读的过程中产生的IO就是逻辑IO.逻辑读的过程中,是非常消耗cpu资源的.因此,执行sql的逻辑读越少越好.sql调优必须调整buffer get很大的sql语句

logical reads= consistent gets + db block gets,逻辑读其实是DB BLOCK GETS 和 consistents Gets 之和

DB block gets---当前请求的块数目

Consistent gets---数据请求总数在回滚段buffer中的数据一致性读所需要的数据块

Physical Reads---从磁盘读取数据块的数量(主要原因:buffer中不存在这些块;全表扫描;磁盘排序)

对于整个系统而言,我们用AWR报告为例。

1. 首先要关注的自然是Elapsed Time最高的那些,执行时间最长通常意味着消耗了更多的资源(无论这个资源是物理读还是逻辑读)

2. 其次关注的是Buffer Gets最多的SQL,这就是DB block gets+Consistent gets最多的SQL。大量的不必要的buffer gets会导致CPU time升高,在一个健康并且负载不低并且并不是以计算为主的系统中,CPU time占据首位的Top event通常是需要关注的。

3. 再其次关注Physical Reads最多的,并不是说物理读多的不容易调整,才放在后面关注,实际上是物理读通常都被基本的调优手段给调整完了,如果一个OLTP系统有大量的物理读,,那么应该早就挂掉了,这是很明显的性能问题,会优先就调整好。

Oracle读取数据的方式有2种

1.物理读即是把数据从磁盘读入到buffer catch的过程。

  通常情况下是,如果需要数据的时候发现不存在于buffer catch当中,即oracle就会执行物理读。

2.逻辑读取

逻辑读指的就是从(或者视图从)Buffer Cache中读取数据块。按照访问数据块的模式不同,可以分为即时读(Current Read)和一致性读(Consistent Read)。 

(1)即时读 db block gets

   即时读即读取数据块当前的最新数据。任何时候在Buffer Cache中都只有一份当前数据块。即时读通常发生在对数据进行修改、删除操作时。这时,进程会给数据加上行级锁,并且标识数据为“脏”数据。

(2)一致性读 consistent get

     Oracle是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。

    一致性读就是为了保证数据的一致性。在Buffer Cache中的数据块上都会有最后一次修改数据块时的SCN。

2.为什么要一致性读,为了保持数据的一致性

   如果一个事务需要修改数据块中数据,会先在回滚段中保存一份修改前数据和SCN的数据块,然后再更新Buffer Cache中的数据块的数据及其SCN,并标识其为“脏”数据。

   当其他进程读取数据块时,会先比较数据块上的SCN和进程自己的SCN。如果数据块上的SCN小于等于进程本身的SCN,则直接读取数据块上的数据;

   如果数据块上的SCN大于进程本身的SCN,则会从回滚段中找出修改前的数据块读取数据。通常,普通查询都是一致性读。

Oracle一致性读总结