CREATE [ UNIQUE ] INDEX name ON table [ USING method ] ( { column | ( expression ) } [ opclass ] [, ...] ) [ WHERE predicate ]
CREATE INDEXは index_name インデックスを指定されたテーブル上に作ります。 インデックスは主にデータベースの性能を向上させるために使われます。 (しかし不適切な使用は性能の低下につながります。)
インデックスのキーフィールドは列名として指定されるか、または、括弧内に記載した式として指定されます。 もしインデックスメソッドが複数列に対するインデックスをサポートする場合は、複数のフィールドを指定できます。
インデックスのフィールドは、テーブル行の1つ以上の列の値から計算される式とすることができます。 この機能は、基本型に何らかの変換を行ったものを元とするデータへの高速なアクセスを行う手段として使用することができます。 例えば、upper(col) 計算に基づくインデックスにより、WHERE upper(col) = 'JIM' 句ではインデックスを使用することができます。
PostgreSQL は B-tree、R-tree、hash、GiST のインデックスメソッドを用意しています。 B-tree インデックスメソッドは Lehman-Yao 高並行性 B-tree の実装です。 R-tree インデックスメソッドは Guttman の二次分割アルゴリズムを使用する標準 R-tree を実装します。 hash インデックスメソッドは Litwin の線形ハッシュの実装です。 ユーザも独自にインデックスメソッドを定義することができますが、これはかなり複雑です。
WHERE 句が存在する場合、部分インデックスが作成されます。 部分インデックスは、テーブルの一部、通常は、テーブルの中でより何らかの興味のある部分のみのエントリを持つインデックスです。 例えば、支払済み、未支払の注文を内容としたテーブルがあり、テーブル全体の中で未支払の注文の割合が小さく、かつ、頻繁に使用される場合、この部分のみにインデックスを作成することで性能を向上させることができます。 この他の実現方法としては、UNIQUE 付きの WHERE を使用して、テーブルの一部に一意性を強制することです。
WHERE 句で使用される式は元となるテーブル内にある列のみを参照することができます(しかし、インデックスされた列だけではなく、全ての列を使用することができます)。 また、現在、副問い合わせと集約式については、WHERE で使用することができません。 同一の制限は、式で表されたインデックスのフィールドにも適用されます。
インデックスの定義で使用される全ての関数と演算子は、"不変" でなければなりません。 つまり、その結果は入力引数にのみに依存し、(他のテーブルの内容や現時刻などの) 外部からの影響を受けてはなりません。 この制限は、インデックスの動作は十分に定義されたものであることを確実にします。 ユーザ定義の関数をインデックス式やWHERE句に使用するため、関数を作成する際、その関数に IMMUTABLE (不変) オプションを付けることを忘れないで下さい。
インデックスが(すでにデータがある状態で)作成される時とデータが追加される時に、テーブル内の値が重複していないかを検査します。 重複エントリを生じる結果となるデータの挿入または更新はエラーとなります。
作成されるインデックスの名前です。 この名前には、スキーマ名を含めることはできません。 インデックスは、常にその親テーブルと同じスキーマに作成されます。
インデックスが作成されるテーブルの名前です (スキーマ修飾名の場合もあります)。
インデックスに使われるメソッドの名前です。 btree、hash、rtree、gist から選択します。 デフォルトのメソッドは BTREE です。
テーブルの列の名前です。
そのテーブル上の1つ以上の列を使用した式です。 通常この式は、構文で示した通り括弧で括る必要があります。 しかし、式が関数呼び出しという形になっている場合は括弧を省略することができます。
演算子クラスの名前です。詳細は下記を参照して下さい。
部分インデックス用制約式です。
インデックスが、いつ使用されるか、いつ使用されないか、どのような場合に有用かといった情報については第11章 を参照してください。
現在では、B-treeとGiSTアクセスメソッドのみが、複数列に対するインデックスをサポートしています。 32個まではデフォルトで指定することができます(この制限はPostgreSQL構築の際に変更できます)。 現在ではB-treeのみが一意性インデックスをサポートしています。
演算子クラスはインデックスのそれぞれの列に指定することができます。 演算子クラスはその列のインデックスによって使われる演算子を識別します。 たとえば、4バイト整数上のB-treeインデックスはint4_opsクラスを使います。 この演算子クラスは4バイト整数の比較関数を含みます。 実践では、通常、列のデータ型のデフォルト演算子クラスは十分です。 演算子クラスを持つ大きな意味は、いくつかのデータ型には1つ以上の意味がある順番があるかもしれないということです。 たとえば、絶対値または実数部のどちらかを使って複素数のデータ型をソートしたいかもしれません。 そうするためには2つの演算子クラスをそのデータ型に定義し、インデックスを作る時に適切なクラスを選択します。 演算子クラスについての詳細は、項11.6 と 項33.13 を参照してください。
インデックスを削除するには DROP INDEXを使用して下さい。