以下是翻译Christian Antognini的《Troubleshooting Oracle Performance》P422,关于block prefetching介绍:
在正常情况下,每个基于单个数据块的处理(如rowid访问和Index range scan),如果缓存中不存在该数据块,将导致单个数据块的物理读操作。对于Nested Loop关联来说,特别是进行多行处理,单数据块物理读将变得没有效率。事实上,通常NL关联通过多个单数据块物理读来访问多个连续的数据块。
为了有效提高NL关联,数据库引擎利用block prefetching,优化器目标是用一个多数据块物理读来替代多个单数据块物理读,多数据块物理读不单单针对表,也针对索引。
查看访问路径我们无法获知数据库引擎是否使用prefetching,只能从server进程执行物理读来窥探,特别是等待事件中相关信息:
1、db file senquential read 事件,对应是单数据块物理读,如果发生该等待事件,表示block prefetching没有被使用,或者是所需的数据块已经在缓存中。
2、db file scattered read事件,对应是多数据块物理读,因此,如果发生ROWID访问或Index Range Scan,意味着blcok prefetching被使用。
非常重要一点是,我们无法控制block prefetching的使用,只能是数据库引擎决定是否使用block prefetching。
注: 参看metalink 406966.1介绍,table prefetching 可能导致错误的结果。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/354732/viewspace-619397/,如需转载,请注明出处,否则将追究法律责任。