物理读 逻辑读 即时读 一致读 读一致性 这几个概念很容易混淆,下面来深入讨论。 1. 物理读(physical reads) 什么叫计算机中的物理读? 如果我们需要的数据不在内存中,那么cpu要获取该数据就必须去磁盘上读取。此时必须要经过磁盘控制器的输入输出,这就叫物理I/O. 表现在ORACLE中,就是如果一个session查询一个表,此时这个表数据没有在内存中,那么计算机必须去磁盘上的数据文件中读出数据到 内存,并从内存中传入cpu中执行,此时就产生了物理i/o。 记住:一次物理读必然引起一次逻辑读。 2. 逻辑读(logic reads)(=即时读+一致读) 什么叫计算机中的逻辑读? 如果我们需要的数据此时恰好在内存中,那么就不需要去磁盘上读取,直接在内存中获取到传入cpu中即可,这就叫逻辑I/O。 而在oracle数据库中,对于逻辑读的定义和计算机原理中的逻辑读定义是有区别的。 并且oracle定义:逻辑读=即时读+一致读。 将数据从内存中传入cpu执行,我们叫逻辑读。所以同样的业务,cpu处理得越少,肯定响应时间越快,cpu处理得越少必然逻辑读就更少。 所以:反过来,有效降低逻辑读,必然节约更多的处理时间,这就是sql优化的基本准则。 3. 即时读(db block gets) 什么是即时读? 这个是oracle数据库专有的概念:得到块来实际更新所要修改的行时,所完成的获取叫即时读【tom大师】。 注意是修改,所以可以肯定:select不会发生即时读,它只发生在update和delete时。 那究竟怎么理解即时读? 即时读,就是在当前读模式下请求的block的次数。当前模式,表示请求的数据是当前的状态,不会去读undo数据。只读数据块的当前模式。 所以即时读只发生在更新(和删除)操作时。更新数据时,不管能否在内存找到被更新的数据,此时都将发生即时读current read(db block gets)。 而对于查询操作,不管数据是在哪里被找到,都不发生即时读。因为查询是一致模式下的操作,一致模式表示去请求数据块时要按照一致模式去读取。 这样就可能需要undo来构造cr块。 所以:select都不会发生即时读;
物理读&逻辑读&即时读&一致读&读一致性
最新推荐文章于 2024-01-22 10:35:31 发布