• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

Oracle一致性读总结

mysql 搞代码 4年前 (2022-01-09) 14次浏览 已收录 0个评论

什么是逻辑读? 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

本文来源[email protected]搞@^&代*@码2网     Oracle是一个多用户系统。当一个会话开始读取数据还未结束读取之前,可能会有其他会话修改它将要读取的数据。如果会话读取到修改后的数据,就会造成数据的不一致。

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

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

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

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

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


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:Oracle一致性读总结

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址