.\\" auto-generated by docbook2man-spec $Revision: 1.2 $
.TH "CREATE INDEX" "" "2006-10-20" "SQL - 言語" "SQLコマンド"
.SH NAME
CREATE INDEX \- 新しいインデックスを定義する

.SH SYNOPSIS
.sp
.nf
CREATE [ UNIQUE ] INDEX \fIname\fR ON \fItable\fR [ USING \fImethod\fR ]
    ( { \fIcolumn\fR | ( \fIexpression\fR ) } [ \fIopclass\fR ] [, ...] )
    [ TABLESPACE \fItablespace\fR ]
    [ WHERE \fIpredicate\fR ]
.sp
.fi
.SH "説明"
.PP
\fBCREATE INDEX\fRは、指定したテーブル上に\fIindex_name\fRインデックスを作ります。
インデックスは主にデータベースの性能を向上するために使われます
（しかし、インデックスの不適切な使用は性能の低下につながります）。
.PP
インデックスのキーフィールドは、列名、または括弧に囲まれた式として指定されます。
インデックスメソッドが複数列に対するインデックスをサポートする場合は、複数のフィールドを指定できます。
.PP
インデックスのフィールドとして、テーブル行の1つ以上の列の値を計算する式を指定できます。
この機能は、元のデータに何らかの変換を加えた値を基とするデータへの高速なアクセスを行う手段として使用することができます。
例えば、upper(col)という計算に基づくインデックスがあれば、WHERE upper(col) = 'JIM'句ではインデックスを使用することができます。
.PP
\fBPostgreSQL\fRはB-tree、R-tree、hash、GiSTのインデックスメソッドを用意しています。
B-treeインデックスメソッドは、Lehman-Yao高並行性B-treeの実装です。
R-treeインデックスメソッドは、Guttmanの二次分割アルゴリズムを使用する標準R-treeの実装です。
hashインデックスメソッドは、Litwinの線形ハッシュの実装です。
ユーザが独自にインデックスメソッドを定義することもできますが、これはかなり複雑です。
.PP
WHERE句が存在する場合、\fI部分インデックス\fRが作成されます。
部分インデックスは、テーブルの一部、通常は、テーブルの中でよりインデックスが有用な部分のみのエントリを持つインデックスです。
例えば、支払済みの注文と未支払の注文を情報として持つテーブルがあり、テーブル全体における未支払の注文の割合が小さく、かつ、頻繁に使用される場合、未支払の注文のみにインデックスを作成することで性能を向上できます。
部分インデックスのその他の利用方法として、\fBUNIQUE\fR付きの\fBWHERE\fRを使用して、テーブルの一部に一意性を強制する例が考えられます。
詳細はthe documentationを参照してください。
.PP
WHERE句内の式では、元となるテーブルの列のみを参照できます。
しかし、インデックスを付加する列だけではなく、全ての列を使用することができます。
また、現在、副問い合わせと集約式については、\fBWHERE\fRで使用することができません。
同一の制限は、式で表されたインデックスのフィールドにも適用されます。
.PP
インデックスの定義で使用される全ての関数と演算子は、``不変''（immutable）でなければなりません。
つまり、結果は入力引数にのみに依存し、（他のテーブルの内容や現時刻などの）外部からの影響を受けてはなりません。
この制限によって、インデックスの動作が十分定義されていることが保証されます。 
インデックス式やWHERE句にユーザ定義の関数を使用する場合、関数を作成する際、IMMUTABLE（不変）オプションを付けることを忘れないでください。
.SH "パラメータ"
.TP
\fBUNIQUE\fR
インデックスを（既にデータがある状態で）作成する時、テーブルにデータを追加する時に、テーブル内の値が重複していないかを検査します。
重複エントリを生じるデータの挿入または更新はエラーとなります。
.TP
\fB\fIname\fB\fR
作成するインデックスの名前です。 
この名前には、スキーマ名を含めることはできません。
インデックスは、常にその親テーブルと同じスキーマに作成されます。
.TP
\fB\fItable\fB\fR
インデックスを作成するテーブルの名前です（スキーマ修飾名の場合もあります）。
.TP
\fB\fImethod\fB\fR
インデックスに使われるメソッドの名前です。
btree、hash、rtree、gistから選択します。
デフォルトのメソッドはbtreeです。
.TP
\fB\fIcolumn\fB\fR
テーブルの列の名前です。
.TP
\fB\fIexpression\fB\fR
テーブル上の1つ以上の列を使用した式です。
通常この式は、構文で示した通り括弧で囲む必要があります。
しかし、式が関数呼び出し形式になっている場合は括弧を省略することができます。
.TP
\fB\fIopclass\fB\fR
演算子クラスの名前です。詳細は下記を参照してください。
.TP
\fB\fItablespace\fB\fR
インデックスを生成するテーブル空間です。
指定されなかった場合、default_tablespaceが使用されます。
default_tablespaceが空文字列である場合は、データベースのデフォルトのテーブル空間が使用されます。
.TP
\fB\fIpredicate\fB\fR
部分インデックス用の制約式です。
.SH "注釈"
.PP
インデックスが、どのような時に使用され、どのような時に使用されないか、また、どのような場合に有用かといった情報についてはthe documentationを参照してください。
.PP
現在は、B-treeとGiSTインデックスメソッドのみが、複数列に対するインデックスをサポートしています。
指定できる列は、デフォルトでは32個までです（この制限はPostgreSQL構築の際に変更できます）。
現在、B-treeのみが一意性インデックスをサポートしています。
.PP
\fI演算子クラス\fRは、インデックスのそれぞれの列に指定することができます。
演算子クラスは、その列のインデックスが使う演算子を識別します。
例えば、4バイト整数に対するB-treeインデックスには、int4_opsクラスを使います。
この演算子クラスには、4バイト整数の比較関数が含まれています。
実際の使用では、通常、列のデータ型のデフォルト演算子クラスで十分です。
演算子クラスを保持する主な理由は、データ型の中には有意な順序を2つ以上持つものがあるかもしれないからです。
例えば、絶対値または実数部のどちらかを使って複素数のデータ型をソートしたい場合がありえます。
これを実現するには、データ型として2つの演算子クラスを定義し、インデックスを作る時に適切なクラスを選択します。
演算子クラスについての詳細は、the documentationとthe documentationを参照してください。
.PP
インデックスを削除するには、DROP INDEX [\fBdrop_index\fR(l)]を使用してください。
.PP
デフォルトでは、インデックスはIS NULL句では使用されません。
このような場合、IS NULL述部を使用した部分インデックスを作成するのが最善です。
.SH "例"
.PP
filmsテーブルのtitle列にB-treeインデックスを作ります。
.sp
.nf
CREATE UNIQUE INDEX title_idx ON films (title);
.sp
.fi
.PP
filmsテーブル上にcode列に対するインデックスを作成します。
また、このインデックスをindexspaceテーブル空間内に生成します。
.sp
.nf
CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;
.sp
.fi
.SH "互換性"
.PP
\fBCREATE INDEX\fRはPostgreSQLの拡張です。
標準SQLにはインデックスについての規定はありません。
.SH "関連項目"
ALTER INDEX [\fBalter_index\fR(l)], DROP INDEX [\fBdrop_index\fR(l)]
