索引rowid BATCHED的表访问与索引rowid的表访问之间的区别

时间:2016-04-30 15:55:59

标签: oracle sql-execution-plan

我在一个简单的SELECT语句中使用了Oracle数据库中的EXPLAIN PLAN,以了解它是如何工作的。在EXPLAIN PLAN的一个输出中,提到了table access by index rowid,而在另一个输出中有table access by index rowid BATCHED。他们之间有什么区别?

1 个答案:

答案 0 :(得分:11)

该文档仅包含有关此主题的一个句子:
https://docs.oracle.com/database/121/TGSQL/tgsql_optop.htm#GUID-4180BA97-3E2C-41F9-B282-4FB3FF9532CB

  

步骤1中显示的BATCHED访问意味着数据库检索a   索引中的行ID很少,然后尝试访问块中的行   命令改善聚类并减少聚集次数   数据库必须访问一个块。

考虑以下(简化)索引

的例子
+-------------+------------------+
| index value | block nbr-rowid  |
+-------------+------------------+
|      1      |   015-000123     |
|      2      |   034-000527     |
|      3      |   088-000285     |
|      4      |   015-000889     |
|      5      |   088-000632     |
........
........

在“正常”(非批处理)方法中,Oracle按索引确定的顺序检索行:

  1. 检索块15,然后从该块
  2. 检索行015-000123
  3. 检索块34,然后从该块
  4. 检索行034-000527
  5. 检索块88,然后从该块
  6. 检索行088-000285
  7. 检索块15 (再次),然后从此块中检索行015-000889
  8. 检索第88块(再次),然后从此块中检索第088-000632行
  9. 在批处理方法中,oracle从索引中检索一些条目,然后首先按块数对它们进行排序,然后按照块数确定的顺序处理条目:

    1. 检索块15,然后从此块中检索行015-000123和015-000889
    2. 检索块34,然后从该块
    3. 检索行034-000527
    4. 检索块88,然后从此块中检索行088-000285和088-000632
    5. 正如您在此示例中所看到的,块仅被提取3次而不是5次,因此从磁盘读取的块数已经减少 - 一些块只读取一次而不是两次(或更多次)。