CREATE INDEX

Name

CREATE INDEX  --  二次インデックスを作成する。

Synopsis

CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( column [ ops_name ] [, ...] )
CREATE [ UNIQUE ] INDEX index_name ON table
    [ USING acc_name ] ( func_name( column [, ... ]) [ ops_name ] )
  

入力

UNIQUE

システムによって、(もし既にデータが存在しているのであれば)イン デックスが作成された時、及び、データが追加される度にテーブル内 の値に重複があるかどうか検査がなされます。

index_name

作成される、インデックス名。

table

インデックスをつけるテーブル名。

acc_name

インデックスで使用されるアクセスメソッド名。 デフォルトのアクセスメソッドは BTREE です。 Postgres はインデックス用に、3 つのアクセスメソッド を用意しています。

BTREE

Lehman-Yao による高同時性 btree の実装。

RTREE

Guttman による二次分割アルゴリズムを使用した、 標準 の rtree の実装。

HASH

Litwin による線形ハッシュの実装。

column

テーブルの列名。

ops_name

関連した演算子クラス。詳細は後で説明します。

func_name

インデックス付けされる値を返す関数。

出力

CREATE

インデックスの作成に成功した場合に返されるメッセージ。

ERROR: Cannot create index: 'index_name' already exists.

インデックスの作成ができなかった場合に起こるエラー。

説明

CREATE INDEX は指定した table 上に index_name インデックスを作成します。

Tip: インデックスは主にデータベースの性能を向上させるために 使用されます。 しかし、不適切に使用すると逆に性能を落すことになります。

上で示した最初の構文では、インデックスのキーフィールド (複数 化) は列名として指定されています。 インデックスのアクセスメソッドが複数列に対するインデック スをサポートしている場合、複数のフィールドを指定することがで きます。

上で示した 2 番目の構文では、インデックスは 1 つのクラスの 1 つ以上の属性に適用されるユーザ定義の func_name 関数の 結果を元に定義されます。 このような 関数インデックス により、 通常は元となるデータに適用する際に何らかの変換を必要とする、 関数に基づいたデータへの高速なアクセスが可能です。 (訳注: 演算子ではなく関数として訳)

Postgres はインデックス用に btree、rtree、hash アクセスメ ソッドを用意しています。 btree アクセスメソッドは Lehman-Yao による高同時実行性 btree の実装です。 rtree アクセスメソッドは Guttman による二次分割アルゴリズムを 使用した標準 rtree の実装です。 hash アクセスメソッドは Litwin による線形ハッシュの実装です。 これらのアルゴリズムは単体で使用した場合、(例えば静的ハッシュ アクセスメソッドの場合など) これら全てのアクセスメソッドは完 全に動的であり、定期的に最適化する必要がないことを示している ということができます。

インデックスを削除する場合は DROP INDEX を使用して下さい。

注意

次のいずれかを使用した比較の際にインデックス付けされた属性が 含まれていた場合は常に、 Postgres の問い合わせオプティマイ ザは btree インデックスを使用するものとみなします。 <, <=, =, >=, >

次のいずれかを使用した比較の際にインデックス付けされた属性が 含まれていた場合は常に、 Postgres 問い合わせオプティマイザ は rtree インデックスを使用するものとみなします。 <<, &<, &>, >>, @, ~=, &&

= 演算子を使用した比較の際にインデック ス付けされた属性が含まれていた場合は常に、 Postgres 問い合わせオプティマイザ はハッシュインデックスを使用するものとみなします。

現在、btree アクセスメソッドのみが複数列のインデックスをサ ポートしています。 デフォルトでは 16 個までのキーを指定することができます。 (この制限は Postgres の構築時に変更することができます。)

演算子クラスをインデックスの各列 に指定することができます。 演算子クラスはその列のインデックスによって使用される 演算子を識別します。 例えば、4 バイトの整数上の btree インデックスは int4_ops クラスを使用します。この演算子 クラスは 4 バイト整数を比較する機能を持っています。 実際問題として、通常はデフォルトのそのフィールドデータ型の 演算子クラスで充分です。 演算子クラスを持つ主な意味は、ある種のデータ型では複数の有 意義な順序が存在することです。 例えば、複素数データ型の場合は、その絶対値でソートをする場 合も実数部分でソートをする場合も考えられます。 そのデータ型に対して2 つの演算子クラスを定義し、インデック スを作成する際に適切なクラスを選択することでこれを行なうこ とができます。 次のような、いくつかの特殊用途用の演算子クラスがあります。

次の問い合わせは、定義済みの演算子クラスを全てを示します。

SELECT am.amname AS acc_name,
       opc.opcname AS ops_name,
       opr.oprname AS ops_comp
    FROM pg_am am, pg_amop amop,
         pg_opclass opc, pg_operator opr
    WHERE amop.amopid = am.oid AND
          amop.amopclaid = opc.oid AND
          amop.amopopr = opr.oid
    ORDER BY acc_name, ops_name, ops_comp
    

使用法

films テーブルの title フィールドに対して btree インデックスを作成します。

CREATE UNIQUE INDEX title_idx
    ON films (title);
  

互換性

SQL92

CREATE INDEX は Postgres の拡張言語です。

SQL92 には CREATE INDEX はありません。