Oracle:什么是单块与多块IO

Dan*_*anK 4 sql oracle indexing io block

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

我正在阅读一篇关于Oracle Optimizer错综复杂的文章,以及Explain Plan如何确定最便宜的SQL查询计划.现在我在对不同的接入方式(如部分全索引扫描快速全索引扫描),我不断看到引用单段多嵌段 I/O读取.

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

问题

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

gve*_*nzl 7

多块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以获取包含该块的数据库块)实际行).但是,如果您读取大量数据,因为您通常在数据仓库环境中进行大型表上的聚合,那么在基础I/O系统8kb块之后的8kb块之后请求8kb块效率会低一些.例如,可以在一次物理读取中读取1MB.因此,Oracle在一个系统READ调用中发出多块I/O并请求1MB块(128个8kb块),而不是128个单独请求,因此加快了I/O请求的性能.

有关此内容的详细信息,请参阅"数据库性能调整指南"中的DB_FILE_MULTIBLOCK_READ_COUNT参数请求的I/O大小数据库参考.Latter也是了解Oracle数据库性能的绝佳资源.