Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造を持ち、様々な種類のオペレーションから構成されます。
この記事では、TABLE ACCESS BY INDEX ROWIDオペレーションについて説明します。
TABLE ACCESS BY INDEX ROWIDオペレーションとはどのようなオペレーションか?
索引アクセスの結果得られたROW IDをキーにして、テーブルから1行のデータを読み出すオペレーションです。ROW IDとは、行データの格納場所を示す物理的な行の識別子です。ROW IDが分かると、その行がどのブロックに格納されているかわかります。
テーブルから読み出すデータが大量の場合、TABLE ACCESS BY INDEX ROWIDオペレーションを含む実行計画は、非効率な可能性があります。そのような場合はSQLチューニングの余地があります。
実行計画の例と処理イメージ図
![TABLE ACCESS BY INDEX ROWID BATCHED - Oracle SQL実行計画](https://cosol.jp/knowledge/wp-content/uploads/sites/2/2020/05/table-access-by-index-rowid.png)
- Id=2 INDEX RANGE SCAN : 索引を範囲検索して、検索条件に合致した行のROW IDのリストを得ます。
- Id=3 TABLE ACCESS BY INDEX ROWID: 索引スキャンの結果得た行のROW IDのリストを元に、その行が格納されているブロックを読み出します。
TABLE ACCESS BY INDEX ROWIDオペレーションに関するFAQ
TABLE ACCESS BY INDEX ROWIDオペレーションを使う実行計画は望ましくないですか?
一般に、テーブルに格納されたデータの件数が多く、そのテーブルから読み出すデータが大量の場合は、TABLE ACCESS BY INDEX ROWIDオペレーションを使う実行計画は望ましくありません。
TABLE FULL ACCESSオペレーションなどの索引を用いないアクセスを行う実行計画になるように、SQLチューニングを行うと、性能が改善される可能があります。
ただし、そもそも、テーブルから読み出すデータが大量である点が問題な場合は、
TABLE FULL ACCESSオペレーションを使っても希望する所要時間までSQLチューニングできない場合もあります。 この場合は、単なる実行計画の変更ではなく、マテリアライズドビューを利用したり、あらかじめ検索結果を別途計算しておくなどの、テーブル設計/オブジェクト設計レベルの対処が必要となるケースもあります。
TABLE ACCESS BY INDEX ROWIDオペレーションを使う実行計画に誘導するヒントは何ですか?
TABLE ACCESS BY INDEX ROWIDオペレーションを使う実行計画に誘導するヒントはありません。
TABLE ACCESS BY INDEX ROWIDオペレーションは索引を使用する実行計画の中で付随的に使用される位置づけのオペレーションです。
よって、索引を使用するヒントを指定すると、間接的にTABLE ACCESS BY INDEX ROWIDオペレーションを使う実行計画に誘導できます。
TABLE ACCESS BY INDEX ROWIDオペレーションの実行時、ブロックは1ブロックずつよみだされますか?
はい。テーブルのブロックは原則的に1ブロックずつよみだされます(シングルブロックリード)。ただし、対象となるテーブルのブロックがすでにメモリにキャッシュされている場合は、物理I/Oは発生しません。また、バージョンによっては、プリフェッチ機能が働く場合もあります。
参考情報
- INDEX RANGE SCANオペレーション
- INDEX UNIQUE SCANオペレーション
- TABLE ACCESS FULLオペレーション
- ROWIDによる表アクセス – Oracle Database SQLチューニング・ガイド
キーワード
シングルブロックリード 索引アクセス インデックスアクセス