1. ホーム
  2. oracle

[解決済み] BATCHEDのインデックスによるテーブルアクセスとROWIDのインデックスによるテーブルアクセスの違い

2022-02-14 07:21:29

質問内容

私は EXPLAIN PLAN を、Oracleデータベースで単純な SELECT ステートメントがどのように機能するかを調べるためです。

の1つの出力では 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

ステップ1で示したBATCHEDアクセスは、データベースが インデックスから数個の行IDを取得し、それから ブロック単位で行にアクセスする オーダー クラスタリングを向上させ、回数が減るようにするためです。 データベースはブロックにアクセスする必要があります。

次のような(簡略化した)インデックスの例を考えてみましょう。

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


Oracle は、quot;normal" (not batched) メソッドにおいて、インデックスによって決定された順序で行を取得します。

  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の行を検索する。

この例では、ブロックの取得が5回から3回になり、ディスクからのブロック読み出し回数が減少していることがわかります。