oracle - 通过索引 rowid BATCHED 访问表和通过索引 rowid 访问表的区别

标签 oracle sql-execution-plan

我正在使用 EXPLAIN PLAN在一个简单的 Oracle 数据库中 SELECT声明只是为了了解它是如何工作的。
EXPLAIN PLAN 的一个输出中有提到table access by index rowid另一个是 table access by index rowid BATCHED .
它们之间有什么区别?

最佳答案

该文档仅包含有关此主题的一句话:

https://docs.oracle.com/database/121/TGSQL/tgsql_optop.htm#GUID-4180BA97-3E2C-41F9-B282-4FB3FF9532CB

The BATCHED access shown in Step 1 means that the database retrieves a few row ids from the index, and then attempts to access rows in block order to improve the clustering and reduce the number of times that the database must access a block.



考虑以下(简化的)索引示例
+-------------+------------------+
| index value | block nbr-rowid  |
+-------------+------------------+
|      1      |   015-000123     |
|      2      |   034-000527     |
|      3      |   088-000285     |
|      4      |   015-000889     |
|      5      |   088-000632     |
........
........

在“正常”(非批处理)方法中,Oracle 按照索引确定的顺序检索行:
  • 检索块 15,然后从此块中检索行 015-000123
  • 检索块 34,然后从此块中检索行 034-000527
  • 检索块 88,然后从此块中检索行 088-000285
  • 检索块 15 (再次) ,然后从此块中检索行 015-000889
  • 检索块 88 (再次) ,然后从此块中检索行 088-000632


  • 在批处理方法中,oracle 从索引中检索一些条目,然后首先按块数对它们进行排序,然后按照块数确定的顺序处理条目:
  • 检索块 15,然后从此块中检索行 015-000123 和 015-000889
  • 检索块 34,然后从此块中检索行 034-000527
  • 检索块 88,然后从此块中检索行 088-000285 和 088-000632

  • 正如你在这个例子中看到的,块只被读取了 3 次而不是 5 次,所以从磁盘读取块的次数已经减少了 - 有些块只被读取了一次而不是两次(或更多次)。

    关于oracle - 通过索引 rowid BATCHED 访问表和通过索引 rowid 访问表的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36957028/

    相关文章:

    sql - Oracle 相当于 SQL Server 快照隔离

    sql - Oracle - 每个日期与日期/时间的最大值

    sqlite3 一起选择最小值,最大值比单独选择它们要慢得多

    sql - 在 Oracle 数据库中设置一个数字的特定位

    oracle - 在oracle中找不到表

    MySQL LEFT JOINS顺序,如何理解正确的算法

    sql-server - 包含的列用于 Seek 运算符

    postgresql - Postgres 在创建查询计划时不使用 HASH 索引

    oracle - 从 pl/sql 中的只写(OUT)参数读取

    sql - 为什么非聚集索引列仍然进行索引扫描而不是索引查找