Oracle SQLチューニングの基本は実行計画を理解することです。実行計画はツリー構造を持ち、様々な種類のオペレーションから構成されます。
この記事では、TABLE ACCESS FULLオペレーションについて説明します。
TABLE ACCESS FULLオペレーションとはどのようなオペレーションか?
テーブル全体を読み出すオペレーションです。
テーブルから読み出すデータが少量の場合、TABLE ACCESS FULLオペレーションを含む実行計画は、非効率な可能性があります。そのような場合はSQLチューニングの余地があります。
実行計画の例と処理イメージ図
select * from tab0 where col_noix = 'A'
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | | | 9 (100)| |
|* 1 | TABLE ACCESS FULL| TAB0 | 16 | 32160 | 9 (0)| 00:00:01 |
--------------------------------------------------------------------------
1 - filter("COL_NOIX"='A')
TABLE ACCESS FULLオペレーションに関するFAQ
TABLE ACCESS FULLオペレーションを使う実行計画は望ましくないですか?
一般に、テーブルに格納されたデータの件数が多く、そのテーブルから読み出すデータが少量の場合は、TABLE ACCESS FULLオペレーションを使う実行計画は望ましくありません。
検索列を含む索引を作成し、INDEX RANGE SCANオペレーションなどの索引を用いたアクセスを行う実行計画になるように、SQLチューニングを行いましょう。
ただし、テーブルに格納されたデータの件数が少量の場合や、テーブルから読み出すデータが大量の場合は、TABLE ACCESS FULLオペレーションを使う実行計画が適切な場合があります。
TABLE ACCESS FULLオペレーションを使う実行計画に誘導するヒントは何ですか?
FULLヒントです。
以下にFULLヒントを指定したSELECT文の例を示します。
-- FROM句に表の別名を指定していない場合
SELECT /*+ FULL tab1 */ FROM tab1 WHERE id > 1000;
-- FROM句に表の別名を指定している場合
SELECT /*+ FULL t */ FROM tab1 t WHERE id > 1000;
TABLE ACCESS FULLオペレーションの実行時、ブロックは1ブロックずつよみだされますか?
いいえ。原則的に、マルチブロックリードと呼ばれる連接した複数ブロックのまとめ読み処理が実行されます。
マルチブロックリードを使うと、連接した複数ブロックをまとめ読みできるため、シングルブロックリードを使う場合に比べて、I/O回数を数分の一に減らすことができます。
参考情報
キーワード
テーブルフルスキャン テーブルスキャン 全件総なめ 全表スキャン 表フルスキャン