Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造で、様々なオペレーションから構成されます。
この記事では、TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションについて説明します。
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションとはどのようなオペレーションか?
索引アクセスの結果得られたROW IDをキーにして、テーブルから行データを読み出す際に、まとめ読み処理(バッチ処理)を行うように改善されたオペレーションです。Oracle Database 12.1から導入されました。
ROW IDとは、行データの格納場所を示す、物理的な行の識別子です。ROW IDが分かると、その行がどのブロックに格納されているかわかります。
従来のTABLE ACCESS BY INDEX ROWIDオペレーションは、テーブルから読み出すデータが多い場合、処理が非効率となる問題点がありましたが、それを改善する目的で導入されました。
実行計画の例と処理イメージ図
- Id=2 INDEX RANGE SCAN : 索引を範囲検索して、検索条件に合致した行のROW IDのリストを得ます。
- Id=1 TABLE ACCESS BY INDEX ROWID BATCHED: 索引スキャンの結果得た行のROW IDのリストをソートして、物理的に近い位置にブロックをまとめた上で、以下のいずれかの方法でまとめ読みします。
- 連接している複数ブロックの場合: マルチブロックリード(対応する待機イベント: “db file scattered read”)
- 連接していない複数ブロックの場合: パラレルリード(対応する待機イベント: “db file parallel read”
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションに関するFAQ
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使う実行計画は望ましくないですか?
一般に、テーブルに格納されたデータの件数が多く、そのテーブルから読み出すデータが大量の場合は、TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使う実行計画は望ましくありません。
TABLE FULL ACCESSオペレーションなどの索引を用いないアクセスを行う実行計画になるように、SQLチューニングを行うと、性能が改善される可能があります。
ただし、そもそも、テーブルから読み出すデータが大量である点が問題な場合は、
TABLE FULL ACCESSオペレーションを使っても希望する所要時間までSQLチューニングできない場合もあります。
この場合は、単なる実行計画の変更ではなく、マテリアライズドビューを利用したり、あらかじめ検索結果を別途計算しておくなどの、テーブル設計/オブジェクト設計レベルの対処が必要となるケースもあります。
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使う実行計画に誘導するヒントは何ですか?
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使う実行計画に誘導するヒントはありません。TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションは索引を使用する実行計画の中で付随的に使用される位置づけのオペレーションです。よって、索引を使用するヒントを指定すると、間接的にTABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使う実行計画に誘導できます。
逆に、TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使わない実行計画に誘導するヒントとして、NO_BATCH_TABLE_ACCESS_BY_ROWIDヒントがあります。ただし、特別な理由が無い限り、あえてTABLE ACCESS BY INDEX ROWID BATCHEDオペレーションを使わないよう誘導する必要はないでしょう。
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションの実行時、ブロックは1ブロックずつよみだされますか?
いいえ。テーブルのブロックはに複数ブロックずつよみだされる場合があります。
連接している複数ブロックの場合は、マルチブロックリードで複数ブロックを一括して読み出します。連接していない複数ブロックの場合は、パラレルリードで、複数ブロックを同時に並列で読み出します。
なお、TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションの場合でも、一部のブロックについては、シングルブロックリードで読み出されます。
TABLE ACCESS BY INDEX ROWID BATCHEDオペレーションが使われるOracleバージョンは何ですか?
Oracle Database 12.1以降で使用されます。
参考情報
キーワード
シングルブロックリード 索引アクセス インデックスアクセス マルチブロックリード パラレルリード