CREATE INDEXはインデックス(索引)を作成するSQL文である。索引を作成した列は、問い合わせの速度が速くなる。索引はスキーマオブジェクトである。
CREATE [UNIQUE|BITMAP] INDEX [schema.]index ON table (column [ASC|DESC] [,...])
SQL> CREATE UNIQUE INDEX tmp_empno_unique ON emp (empno);
ビットマップ索引を作成する。BITMAP句を指定しない場合は、Bツリー索引を作成する。
表内の列の個別値の数を表内の行の合計数で割った値を カーディナリティ度 と呼ぶ。カーディナリティ度は、作成する索引の種別を判断する際に重要となる。カーディナリティ度の低い列にはビットマップ索引、カーディナリティ度の高い列にはBツリー索引を使用すると、索引のパフォーマンスが向上する。一般的に、カーディナリティ度が1%未満のときにはビットマップ索引を使用する。たとえば、性別を表す列の値は男と女の2種類であるから、200行以上の表で性別列に索引を作成する場合は、ビットマップ索引を使用した方が良い。
インデックスを作成するスキーマを指定する。他ユーザのスキーマ内にインデックスを作成する場合は、CREATE ANY INDEXシステム権限が必要である。
スキーマの指定を省略した場合は、自分のスキーマ内にインデックスが作成される。
作成するインデックスの名前を指定する。
インデックスを作成する対象のテーブルを指定する。
インデックスを作成する対象の列を指定する。
昇順の索引を作成する。ASC句とDESC句のいずれも指定しなかった場合は、昇順の索引が作成される。
ひとつの列に対してインデックスを作成する場合、昇順でも降順でも違いはない。複数の列に対してインデックスを作成する場合、order byで並び替えるパフォーマンスに影響する。インデックスで指定した順番(またはその逆)であれば、高速に並び替えられる。
自分のスキーマにインデックスを作成するには、次のいずれかの条件を満たしている必要がある。
任意のスキーマにインデックスを作成するには、CREATE ANY 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)
PRIMARY KEY制約を付けた列には、自動的にインデックスが作成される。したがって、PRIMARY KEY制約が付いた列にCREATE INDEX文で明示的にインデックスを作成する必要はない。