ORACLE SQL リファレンス(逆引き)

ORACLE SQL リファレンス

Web oracle.se-free.com
SQLチューニング(3)
スポンサード リンク

● 列番号は使用しない
  ORDER BY句に列番号で指定した場合、SQL解析時に読み替え処理が発生するのでパフォーマンス低下に繋がる
 ○ select a.emp_id, a.emp_name from emp a order by salary;

 × select a.emp_id, a.emp_name from emp a order by 5;


● DISTINCT句よりEXISTS句の使用を検討する

  DISTINCTは、条件に一致するレコードを取り出し暗黙のソート処理後に重複レコードを排除することに対し、EXISTS句は条件に一致するレコード1件でもあればそこで処理は終了する為、暗黙のソート処理をしない分、DISTINCTに比べると負荷が小さくなる
 × select distinct a.emp_id, a.dept_id from emp a,dept b
            where a.dept_id = b.dept_id;

 ○ select a.emp_id, a.dept_id from emp a
       where exists (select 'X' from dept_b where a.dept_id = b.dept_id);
 ※DISTINCTの他にも、GROUP BYやUNION、INTERSEST、MINUS等は暗黙のソート処理が実行されるので、極力使用を避けた方が良い。


● NOT IN句よりNOT EXISTS句の使用を検討る

  NOT IN句は、内部的にソートマージの結合をすることでテーブルをフルスキャンするのに対し、NOT EXISTS句は条件に一致するレコード1件でもあればそこで処理は終了する為、NOT IN句に比べると負荷が小さくなる
 × select distinct a.emp_id, a.dept_id from emp a
    where a.dept_id not in (select b.dept_id from dept where job_id = 'J01');

 ○ select a.emp_id, a.dept_id from emp a
   where not exists (select 'X' from dept_b where a.dept_id = b.dept_id and job_id = 'J01');

スポンサード リンク


大文字/小文字/空白や改行の数を統一する
バインド変数を使用する
ワイルドカード「 * 」は使用しない
ANDよりBETWEENの使用を検討する
HAVINGよりWHEREの使用を検討する
UNIONよりUNION ALLの使用を検討する
テーブルに別名を付ける
ROWIDの使用を検討する
列番号は使用しない
DISTINCT句よりEXISTS句の使用を検討する
NOT IN句よりNOT EXISTS句の使用を検討する
INDEX列を使用しない検索(1)
INDEX列を使用しない検索(2)

SQLチューニングへ
忘れっぽいエンジニアのオラクルSQLリファレンス TOPへ