PostgreSQL 8.0.0 文書
前のページ | 巻戻し |  | 早送り | 次のページ

# CREATE INDEX

## 名前

CREATE INDEX -- 新しいインデックスの定義

## 概要

    CREATE [ UNIQUE ] INDEX name ON table [ USING method ]
        ( { column | ( expression ) } [ opclass ] [, ...] )
        [ TABLESPACE tablespace ]
        [ 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`を使用して、テーブルの一部に一意性を強制することです。 詳細は項11.7を参照してください。

`WHERE`句で使用される式は元となるテーブル内にある列のみを参照することができます。 しかし、インデックス付けされる列だけではなく、全ての列を使用することができます。 また、現在、副問い合わせと集約式については、`WHERE`で使用することができません。 同一の制限は、式で表されたインデックスのフィールドにも適用されます。

インデックスの定義で使用される全ての関数と演算子は、"不変"でなければなりません。 つまり、その結果は入力引数にのみに依存し、(他のテーブルの内容や現時刻などの)外部からの影響を受けてはなりません。 この制限は、インデックスの動作は十分に定義されたものであることを確実にします。 ユーザ定義の関数をインデックス式や`WHERE`句に使用するため、関数を作成する際、その関数にIMMUTABLE(不変)オプションを付けることを忘れないでください。

## パラメータ

`UNIQUE`

  インデックスが（すでにデータがある状態で）作成される時とデータが追加される時に、テーブル内の値が重複していないかを検査します。 重複エントリを生じる結果となるデータの挿入または更新はエラーとなります。

`name`

  作成されるインデックスの名前です。 この名前には、スキーマ名を含めることはできません。 インデックスは、常にその親テーブルと同じスキーマに作成されます。

`table`

  インデックスが作成されるテーブルの名前です (スキーマ修飾名の場合もあります)。

`method`

  インデックスに使われるメソッドの名前です。 `btree`、`hash`、`rtree`、`gist`から選択します。 デフォルトのメソッドは`btree`です。

`column`

  テーブルの列の名前です。

`expression`

  そのテーブル上の1つ以上の列を使用した式です。 通常この式は、構文で示した通り括弧で括る必要があります。 しかし、式が関数呼び出しという形になっている場合は括弧を省略することができます。

`opclass`

  演算子クラスの名前です。詳細は下記を参照してください。

`tablespace`

  インデックスを生成するテーブル空間です。 指定されなかった場合、default_tablespaceが使用されます。 もし、`default_tablespace`が空文字列であった場合はデータベースのデフォルトのテーブル空間が使用されます。

`predicate`

  部分インデックス用の制約式です。

## 注釈

インデックスが、いつ使用されるか、いつ使用されないか、どのような場合に有用かといった情報については第11章を参照してください。

現在では、B-treeとGiSTインデックスメソッドのみが、複数列に対するインデックスをサポートしています。 デフォルトで32個まで指定することができます（この制限はPostgreSQL構築の際に変更できます）。 現在ではB-treeのみが一意性インデックスをサポートしています。

演算子クラスはインデックスのそれぞれの列に指定することができます。 演算子クラスはその列のインデックスによって使われる演算子を識別します。 例えば、4バイト整数上のB-treeインデックスは`int4_ops`クラスを使います。 この演算子クラスは4バイト整数の比較関数を含みます。 実践では、通常、列のデータ型のデフォルト演算子クラスで十分です。 演算子クラスを持つ大きな意味は、いくつかのデータ型には1つ以上の意味がある順番があるかもしれないということです。 例えば、絶対値または実数部のどちらかを使って複素数のデータ型をソートしたいかもしれません。 そうするためには2つの演算子クラスをそのデータ型に定義し、インデックスを作る時に適切なクラスを選択します。 演算子クラスについての詳細は、項11.6と項31.14を参照してください。

インデックスを削除するにはDROP INDEXを使用してください。

インデックスは、デフォルトでは`IS NULL`句では使用されません。 こうした場合の最善の方法は、`IS NULL`述部を使用した部分インデックスを作成することです。

## 例

`films`テーブルの`title`列にB-treeインデックスを作ります。

    CREATE UNIQUE INDEX title_idx ON films (title);

`films`テーブル上に`code`列に対するインデックスを作成します。 また、このインデックスを`indexspace`テーブル空間内に生成します。

    CREATE INDEX code_idx ON films(code) TABLESPACE indexspace;

## 互換性

`CREATE INDEX`はPostgreSQLの言語拡張です。 標準SQLにはインデックスについての規定はありません。

## 関連項目

ALTER INDEX, DROP INDEX

前のページ | ホーム | 次のページ
CREATE GROUP | 上に戻る | CREATE LANGUAGE