【问题标题】:Oracle: What is Single-Block vs. Multiblock IOOracle:什么是单块与多块 IO
【发布时间】:2014-09-28 03:45:24
【问题描述】:

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

我正在阅读一篇精彩的article,其中介绍了 Oracle 优化器的复杂性以及解释计划如何确定 SQL 查询的最便宜计划。现在我在关于不同访问方法的部分(例如 Full Index ScanFast Full Index Scan)并且我不断看到对 Single-块 vs. 多块 I/O 读取。

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

问题

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

【问题讨论】:

    标签: sql oracle io indexing block


    【解决方案1】:

    多块 I/O 表示使用单个操作系统 READ 调用读取了多少数据库块。在当前版本(11gR2 和 12c)中,默认值对应于可以有效执行的最大 I/O 大小。最大 I/O 大小值取决于平台,大多数平台为 1 MB。多块 I/O 由 DB_FILE_MULTIBLOCK_READ_COUNT 数据库参数控制。

    换句话说:通常现在一个数据库块是 8kb。 8kb 可以包含一个表的几行,如果它用于索引叶条目,则可以包含更多的索引键。现在,当您执行单块 I/O 时,您会读取这些 8kb 块中的 1 个 - 通常是按索引键值查找行 id(确定索引键所在的块并执行单块 I/O 以获取包含实际行)。但是,如果您读取大量数据是因为您这样做了,例如大型表上的聚合,通常在数据仓库环境中,当底层 I/O 系统可以在一次物理读取中读取 1MB 时,在 8kb 块之后请求 8kb 块之后请求 8kb 块的效率会降低。因此,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 了解更多信息。后者也是了解 Oracle 数据库性能的重要资源。

    【讨论】:

    • 很棒的反应,gvenzl!这正是我一直在寻找的,并且非常有帮助。非常感谢这种教育反应。谢谢!
    猜你喜欢
    • 2019-09-04
    • 2021-02-20
    • 2013-09-11
    • 2016-02-26
    • 2018-07-28
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多