CREATE INDEX

CREATE INDEXはインデックス(索引)を作成するSQL文である。索引を作成した列は、問い合わせの速度が速くなる。索引はスキーマオブジェクトである。

CREATE INDEXの構文

CREATE [UNIQUE|BITMAP] INDEX [schema.]index ON table (column [ASC|DESC] [,...])
UNIQUE
値が重複しない索引を作成する。
SQL> CREATE UNIQUE INDEX tmp_empno_unique ON emp (empno);
BITMAP

ビットマップ索引を作成する。BITMAP句を指定しない場合は、Bツリー索引を作成する。

表内の列の個別値の数を表内の行の合計数で割った値を カーディナリティ度 と呼ぶ。カーディナリティ度は、作成する索引の種別を判断する際に重要となる。カーディナリティ度の低い列にはビットマップ索引、カーディナリティ度の高い列にはBツリー索引を使用すると、索引のパフォーマンスが向上する。一般的に、カーディナリティ度が1%未満のときにはビットマップ索引を使用する。たとえば、性別を表す列の値は男と女の2種類であるから、200行以上の表で性別列に索引を作成する場合は、ビットマップ索引を使用した方が良い。

schema

インデックスを作成するスキーマを指定する。他ユーザのスキーマ内にインデックスを作成する場合は、CREATE ANY INDEXシステム権限が必要である。

スキーマの指定を省略した場合は、自分のスキーマ内にインデックスが作成される。

index

作成するインデックスの名前を指定する。

table

インデックスを作成する対象のテーブルを指定する。

column

インデックスを作成する対象の列を指定する。

ASC

昇順の索引を作成する。ASC句とDESC句のいずれも指定しなかった場合は、昇順の索引が作成される。

DESC
降順の索引をが作成する。ASC句とDESC句のいずれも指定しなかった場合は、昇順の索引が作成される。

ひとつの列に対してインデックスを作成する場合、昇順でも降順でも違いはない。複数の列に対してインデックスを作成する場合、order byで並び替えるパフォーマンスに影響する。インデックスで指定した順番(またはその逆)であれば、高速に並び替えられる。

CREATE INDEXに必要な権限

自分のスキーマにインデックスを作成するには、次のいずれかの条件を満たしている必要がある。

任意のスキーマにインデックスを作成するには、CREATE ANY INDEXシステム権限が必要である。

CREATE INDEXの使用例

社員テーブル(emp)の給与カラム(sal)からインデックスを作成する。

CREATE INDEX empsalidx ON emp (sal)

社員テーブルの給与カラムと歩合給カラム(comm)からインデックスを作成する。歩合給カラムは降順とする。

CREATE INDEX empsalcommidx ON emp (sal, comm DESC)

ビットマップ・インデックスの作成

性別や血液型のようにカーディナリティが低い(取りうる値が限られている)列に対してインデックスを作るときは、ビットマップ・インデックスを作成すると、パフォーマンスが向上する。

CREATE BITMAP INDEX emp_gender ON emp (gender)

PRIMERY KEY制約を付けた列はインデックス作成不要

PRIMARY KEY制約を付けた列には、自動的にインデックスが作成される。したがって、PRIMARY KEY制約が付いた列にCREATE INDEX文で明示的にインデックスを作成する必要はない。

関連SQL

ALTER INDEX
インデックスを再構築する。
DROP INDEX
インデックスを削除する。