速いSQLの記述について
Oracleなどのリレーショナル・データベース管理システム(RDBMS)では、同じ結果を返すSQLであってもSQLの記述によって応答時間が大きき異なります。
速いSQLの記述ポイント1 WHEREの左辺に関数や算術演算子を使用しない。
WHEREの左辺に関数や算術演算子を使用した場合、インデックスが使用されません。インデックスが定義されている項目でもテーブル全体が走査されます。
-- インデックスが使用されないSQLの例) SELECT ID FROM TAB1 WHERE NO1 - NO2 > 100;
速いSQLの記述ポイント2 後方一致を使用しない。
インデックスが定義されている項目でも後方一致で指定した場合、インデックスが使用されません。インデックスが定義されている項目でもテーブル全体が走査されます。
-- インデックスが使用されないSQLの例) SELECT ID FROM TAB1 WHERE NO1 LIKE '%00';
速いSQLの記述ポイント3 IS NULL、IS NOT NULLのみで検索しない。
WHEREにIS NULL、IS NOT NULLのみで検索した場合、インデックスが使用されません。インデックスが定義されている項目でもテーブル全体が走査されます。
-- インデックスが使用されないSQLの例) SELECT ID FROM TAB1 WHERE NO1 IS NULL;
速いSQLの記述ポイント4 テーブルに別名を使用する。
テーブルに別名をつけたSQLとつけなかったSQLでは、テーブルに別名をつけたSQLが解析処理を減らすことができるので速いSQLになります。
-- テーブルに別名をつけたSQLの例) SELECT T1.ID FROM TAB1 T1 WHERE T1.NO1 = '100';
速いSQLの記述ポイント5 バインド変数を使用する。
バインド変数を使用することでRDBMSの実行計画にキャッシュされたSQLを再利用する。
-- バインド変数を使用したSQLの例) variable v1 NUMBER; execute :v1 := 100; SELECT T1.ID FROM TAB1 T1 WHERE T1.NO1 = :v1;
速いSQLの記述ポイント6 DISTINCTよりEXISTSを使用する。
SQLにDISTINCTを使用すると処理速度が遅くなります。DISTINCTをEXISTSに置き換えたSQLを使用することで速度が速くなる場合があります。
速いSQLの記述ポイント7 SELECTする項目を減らす。
SELECTに「*」を使用した場合、テーブルの全項目を取得しますが、項目取得にリソースをするので速度が遅くなります。SELECTに「*」ではなく項目を指定することで速度が速くなる場合があります。
速いSQLの記述ポイント8 演算子の組み合わせに注意する。
WHEREに不等号(「>」、「<」)、等号(「=」)を「AND」で組み合わせた場合、等号(「=」)のみにインデックスが使用されます。また、不等号(「>」、「<」)同士の組み合わせた場合は、先に指定した条件のみにインデックスが使用されます。
速いSQLの記述ポイント9 インデックスだけでデータの取得する。
結果を取得するのに必要なのがインデックスだけで、インデックス以外は検索に使用しない場合、効率的なデータ検索で速いSQLになります。