速い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になります。

inserted by FC2 system