按索引 rowid BATCHED 访问 table 和按索引 rowid 访问 table 之间的区别

Difference between table access by index rowid BATCHED and table access by index rowid

我在 Oracle 数据库中使用 EXPLAIN PLAN 一个简单的 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     |
........
........

在 "normal"(非批处理)方法中,Oracle 按照索引确定的顺序检索行:

  1. 检索块 15,然后从此块检索行 015-000123
  2. 检索块 34,然后从此块检索行 034-000527
  3. 检索块 88,然后从此块检索行 088-000285
  4. 检索块 15 (再次),然后从此块检索行 015-000889
  5. 检索块 88 (再次),然后从此块检索行 088-000632

在批处理方法中,oracle 从索引中检索一些条目,然后首先按块数对它们进行排序,然后按照块数确定的顺序处理条目:

  1. 检索块 15,然后从此块检索行 015-000123 和 015-000889
  2. 检索块 34,然后从此块检索行 034-000527
  3. 检索块 88,然后从此块检索行 088-000285 和 088-000632

如您在此示例中所见,块仅被提取 3 次而不是 5 次,因此从磁盘读取块的次数已减少 - 一些块仅被读取一次而不是两次(或更多)次。