所以我知道这是一个非常基本的问题,但我很难在Google,Wiki或Oracle上找到答案。 (我看到的每个技术文档都假设已经理解了这些主题)
我正在阅读关于Oracle Optimizer的复杂性的一个很棒的article以及Explain Plan如何确定最便宜的SQL查询计划。现在我正在关于不同访问方法的部分(例如完整索引扫描和快速完整索引扫描),我一直看到 Single-的引用阻止与多块 I / O读取。
我以前见过这些概念,但我只是模糊地了解它与Oracle引擎如何访问存储在块上的数据有关。
问题
答案 0 :(得分:7)
Multiblock I / O表示使用单个操作系统READ调用读取多少个数据库块。在当前版本(11gR2和12c)中,默认值对应于可以有效执行的最大I / O大小。最大I / O大小值取决于平台,对于大多数平台而言为1 MB。多块I / O由DB_FILE_MULTIBLOCK_READ_COUNT数据库参数控制。
换句话说:通常这些天数据库块是8kb。如果用于索引叶条目,则8kb可以包括多行表和更多索引键。现在,当您执行单块I / O时,您会读取这些8kb块中的一个 - 通常是按索引键值查找行ID(确定索引键所在的块并执行单个块I / O以获取包含该块的数据库块)实际行)。但是,如果您阅读了大量数据,例如巨大的表上的聚合,通常在数据仓库环境中,在8kb块之后的8kb块之后要求8kb块的效率较低,而底层I / O系统可以例如在一次物理读取中读取1MB。因此,Oracle发出一个多块I / O,并在一个系统READ调用中请求1MB块(128个8kb块),而不是128个单独的请求,因此加快了I / O请求的性能。
有关详细信息,请查看Database Reference for the DB_FILE_MULTIBLOCK_READ_COUNT parameter和Requested I/O size in the Database Performance Tuning Guide。 Latter也是了解Oracle数据库性能的绝佳资源。