web-dev-qa-db-ja.com

BATCHEDインデックスROWIDによるテーブルアクセスとインデックスROWIDによるテーブルアクセスの違い

簡単なSELECTステートメントでOracleデータベースのEXPLAIN PLANを使用して、それがどのように機能するかを調べています。 EXPLAIN PLANの1つの出力では、table access by index rowidと他のtable access by index rowid BATCHED。それらの違いは何ですか?

10
T.Poe

ドキュメントには、このトピックに関する1つの文のみが含まれています。
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はインデックスによって決定された順序で行を取得します。

  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回しかフェッチされなかったため、ディスクからのブロックの読み取り回数が減り、一部のブロックは2回(2回以上)ではなく1回だけ読み取られました。

13
krokodilko