暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle数据库的db block prefetch

白鳝的洞穴 2021-03-10
2021
昨天有个网友建议老白写篇文章讨论一下Oracle的预读机制,预读是机械硬盘时代的IO加速利器,通过预先把连续存储的数据读出来,从而利用应用的连续读需求减少IO,增加磁盘设备的吞吐量。预读在Oracle这样的数据库系统中是否有效呢?很多老DBA都受到Oracle DSI的影响,认为预读是没有用的。事实上没那么简单,对于一个传统意义上的OLTP系统来说,预读确实可能没有太大作用,甚至对于一个IO负载极高的系统,过大的预读缓冲还会导致IO性能的下降。不过对于一个DSS或者OLAP应用来说,预读还是有一定的价值的,为什么会这样呢?
实际上对于Oracle来说,预读分为底层预读和高层预读。底层预读是基于操作系统或者更为底层的设备的,比如linux操作系统下的read_ahead_kb参数定义的预读大小,缺省大小是128K,如果在一个Oracle的OLTP系统中试图通过增加这个参数来提高整个系统的IO性能,有可能你会徒劳无功,甚至加大了这个参数后,OLTP系统的并发能力还会下降。
Oracle不建议你通过低层预读和OS层面的BUFFER/CACHE来提高ORACLE数据库的性能,是因为Oracle有自己的预读机制。这个预读机制是基于私有算法的,没有公开更多的细节,在外部表现上来看,体现在多块读和并行读方面。多块读是对于单文件的连续读,并行读是针对多个不同文件的并发访问。Oracle的这个预读机制称为“prefetching”,Oracle通过一系列隐含参数来控制prefetching的工作。

上面是11.2的参数,在11G里Oracle增强了prefetching的功能,在这之前,我们感知prefetching功能的主要渠道是BUG,老白也是在十多年前从一些BUG报告里获知了prefetching功能的存在。11g的用户可能有时候会遇到因为db file parallel read等待导致的性能问题,这实际上就是prefetching功能的某些BUG导致的问题。

如果你遇到了上面的因为db file parallel read导致的性能问题,大概率是遇到了db prefetching引起的BUG。针对这种情况,Oracle官方的建议是关闭prefetching功能。

如果要详细的描述Oracle的prefetching工作机制是十分困难的。因为Oracle的Prefetching是和优化器与SQL执行紧密相关的。Oracle的优化器与SQL执行器十分强大,远远超过其他所有的数据库,这也是ORACLE数据库性能强大的最主要的原因之一。Oracle通过SQL的执行计划来十分精确的的确定是否使用prefetching功能。
一个已知的大概率启用prefetching的场景是nested loop是与排序(sort),位图扫描(bitmap scan)与部分nested loop 连接产生的row source进行连接时,Oracle会根据row source的实际情况,在table access by index rowid的时候自动启用prefetching,从而提高这一步操作的性能。比如下面的执行计划:

这个执行计划中的,destination上的TABLE ACCESS BY INDEX ROWID就会启用prefetching。根据Oracle的版本不同,启用prefetching的规则与场景会有很大的不同,因为Oracle的优化器的发展是十分迅速的。Oracle的这种基于优化器与执行器的预读机制,比OS或者设备驱动中的哪种傻瓜式的预读机制,那是要强上无数倍了。这种预读机制是基于数据与业务逻辑的,其准确性与效率十分高。
而OS层面或者设备驱动层面的PRE-READ机制大多数是根据简单的算法,这种算法没有业务逻辑,也不知道应用读取数据的实际需求,所以效率就肯定远远低于Oracle了。
因此在使用Oracle数据库的时候,特别是以OLTP为主的系统上,Oracle不建议OS启用PRE-READ机制,因为Oracle的PREFETCHING效率更高。而对于一些没有如此强大的数据库,使用OS提供的PRE-READ机制,还是能够起到一定的提高IO性能,从而提升数据库处理能力的效果的。不过也要注意,对于一个OLTP系统,如果IO延时过高了,或者IO负载过高,那么加大PRE-READ可能会导致更差的运行效率,这时候减少PRE-READ的大小可能反而会提高性能。总之PRE-READ的调整必须十分贴合场景,只有Oracle的与优化器和执行器紧密相关的算法,才真正的是高效的算法。在运维领域有一句话,通用的另外一个含义就是低效,在这里很好的解释了Oracle的prefetching与OS的PRE-READ之间的差距。
文章转载自白鳝的洞穴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论