Oracle:什么是单块与多块IO

时间:2014-08-05 13:01:15

标签: sql oracle io indexing block

所以我知道这是一个非常基本的问题,但我很难在Google,Wiki或Oracle上找到答案。 (我看到的每个技术文档都假设已经理解了这些主题)

我正在阅读关于Oracle Optimizer的复杂性的一个很棒的article以及Explain Plan如何确定最便宜的SQL查询计划。现在我正在关于不同访问方法的部分(例如完整索引扫描快速完整索引扫描),我一直看到 Single-的引用阻止多块 I / O读取。

我以前见过这些概念,但我只是模糊地了解它与Oracle引擎如何访问存储在块上的数据有关。

问题

  1. 有人可以向我解释这两种读取类型之间的区别,以及为什么在某些情况下可能比另一种更有利?
  2. 使用单块读取的完整索引扫描与使用多块读取的快速完整索引扫描有何重要意义?

1 个答案:

答案 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 parameterRequested I/O size in the Database Performance Tuning Guide。 Latter也是了解Oracle数据库性能的绝佳资源。