オンライン処理のSQLをあと少し速くチューニングする方法

ここでは、オンライン処理で実行されるSQLをあと少しだけ速くする方法を紹介します。
今回紹介するケースは、データアクセスする項目が少ないSQLをチューニングする方法です。

例えば、次のようなSQLです。
このような場合、SELECT句のcol1,co2とwhere句のcol3のたった3つの項目です。
select a.col1,a.col2 from table1 a where a.col3 = ‘test’;

・インデックスがない場合
仮にtable1にインデックスがない場合は、”TABLE ACCESS FULL”となり、データ全件にアクセスし、1件ごとに条件にマッチするか確認することになります。

普通のインデックスがある場合
抽出条件である、col3にインデックスが作成されているとどうなるでしょうか。
その場合は、次のように、INDEXレンジスキャンした後に、対象のデータのROWIDを指定して、データを1行読み込みます。
 TABLE ACCESS BY INDEX ROWID
  INDEX RANGE SCAN

上のインデックスでも性能要件を十分満たすのであれば、問題ないと思います。

あと少し早くする方法
もう少し速くする方法もあります。次のようにINDEXを作成します。
create index ix_table1 on table1(col3,col1,col2);

このインデックスがあると、実行計画が変わります。
INDEXレンジスキャンのみになり、データを1行読み込むという手順が無くなります。
 INDEX RANGE SCAN

なぜなら、INDEXの項目だけでSQLで取得したい項目が全て取得出来るからです。
参考書などでは、カバーリングインデックスと呼ばれていました。

オンライン処理であと数ミリ秒改善したい、というときなど使ってみると良いと思います。

もちろん、インデックスの項目が増えるので、その分データ領域が増えます。
そして、インデックスの項目が増えることで逆に遅くなるケースもあります。

それから、Exadataでは、あんまり有効ではありませんでした。

Exadataは少し特殊なので、チューニングの際は下の記事を参考にしてください。
OracleExadataでのSQLチューニング方法