ST0411044
特殊なインデックスの作成
Tips!
WHERE句の左辺カラムに対して関数や演算子を使うと、そのカラムのインデックスは使用されません。
適切なインデックスが使用できないと、オプティマイザはテーブル・スキャンを行いますが、テーブルのサイズが比較的大きい場合、これには多くのコストがかかってしまいます。
このような場合、特殊なインデックスを作成することで、この問題を回避することができます。
例として、asademo.dbを使用した場合について説明します。 従業員テーブル(employee)から11月生まれの人を探す為に、次のような SQLを実行します。
※カラム(birth_date)にはインデックスがあるものとします。
-------------------------------------------------------------
SELECT * FROM "DBA"."employee" WHERE MONTH(birth_date) = 11
-------------------------------------------------------------
このときプランを確認すると、テーブル・スキャンが行われています。
このテーブルに、カラム(birth_date)の月の値のインデックスを作成します。
-------------------------------------------------------------
CREATE INDEX ix_birth_month
ON employee (
MONTH( birth_date )
AS birth_month )
-------------------------------------------------------------
再び上記のSQLを実行します。
-------------------------------------------------------------
SELECT * FROM "DBA"."employee" WHERE MONTH(birth_date) = 11
-------------------------------------------------------------
プランを確認すると、インデックス(ix_birth_month)が使用されています。
なお、このインデックスを作成すると、計算カラム(birth_month)がテーブルに追加されることに注意してください。
※SELECT * 〜で全カラムを選択した場合に(birth_month)というカラムが増えています。
インデックスの詳細につきましては以下をご参照下さい。
ASA SQL リファレンス・マニュアル
SQL 文
CREATE INDEX 文
|