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 ] )
システムによって、(もし既にデータが存在しているのであれば)イン デックスが作成された時、及び、データが追加される度にテーブル内 の値に重複があるかどうか検査がなされます。
作成される、インデックス名。
インデックスをつけるテーブル名。
インデックスで使用されるアクセスメソッド名。 デフォルトのアクセスメソッドは BTREE です。 Postgres はインデックス用に、3 つのアクセスメソッド を用意しています。
Lehman-Yao による高同時性 btree の実装。
Guttman による二次分割アルゴリズムを使用した、 標準 の rtree の実装。
Litwin による線形ハッシュの実装。
テーブルの列名。
関連した演算子クラス。詳細は後で説明します。
インデックス付けされる値を返す関数。
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 つの演算子クラスを定義し、インデック スを作成する際に適切なクラスを選択することでこれを行なうこ とができます。 次のような、いくつかの特殊用途用の演算子クラスがあります。
box_ops と bigbox_ops の両演算子クラスは box データ型に対する rtree インデック スをサポートします。 両者の違いは、bigbox_ops は非常に大き な浮動小数点座標に対する、乗算、及び、減算の際の浮動小数 点例外を防ぐためにボックス座標を下方向に測定する点です。 20,000 平方単位以上の長方形上のフィールドの場合、 bigbox_ops を使用しなければなりません。
int24_ops 演算子クラスは int2 データに 対するインデックス構築、及び、問い合わせ条件において int4 データに対して比較を行なう場合に有意です。 同様に、int42_ops 演算子クラスは 問い合 わせにおいて int2 データに対して比較を行なう、int4 データに 対するインデックスをサポートします。
次の問い合わせは、定義済みの演算子クラスを全てを示します。
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