複数列インデックス

PostgreSQL 8.0.0 文書
前のページ | 巻戻し | 第 11章インデックス | 早送り | 次のページ

# 11.3. 複数列インデックス

インデックスは、1つ以上の列に定義することができます。 例えば、以下のようなテーブルがあるとします。

    CREATE TABLE test2 (
      major int,
      minor int,
      name varchar
    );

(例えば、`/dev`ディレクトリの内容をデータベースに保持していて) 頻繁に下記のような問い合わせを実行するとします。

    SELECT name FROM test2 WHERE major = constant AND minor = constant;

このような場合、`major`および`minor`という2つの列に1つのインデックスを定義する方が適切かもしれません。

    CREATE INDEX test2_mm_idx ON test2 (major, minor);

現在、B-treeおよびGiSTの実装でのみ、複数列インデックスをサポートしています。 最高32列まで指定可能です。 (この上限は、PostgreSQLを構築する際に変更可能です。 `pg_config.h`ファイルを参照してください。)

問い合わせプランナでは、インデックス定義の最初の列から連続する任意数の右方向の列を含む問い合わせに対して複数列インデックスを使用することができます。 例えば、`(a, b, c)`上のインデックスは、`a`、`b`、および`c`の全てを含む問い合わせ、もしくは`a`および`b`両方を含む問い合わせ、もしくは`a`のみを使用する問い合わせで使用可能ですが、それ以外の組み合わせでは使用できません。 (`a`および`c`を含む問い合わせでは、プランナは、`a`にのみインデックスを使用し、`c`は通常のインデックスが付いていない列のように扱うでしょう。) もちろん、各列はインデックスの種類に適した演算子を使用している必要があります。 他の演算子を持つ句では考慮されません。

複数列インデックスは、インデックスの付いた列を含む句が`AND`で結合されている場合にのみ、使用することができます。 例えば、

    SELECT name FROM test2 WHERE major = constant OR minor = constant;

この問い合わせでは、上記で定義された`test2_mm_idx`インデックスを使用して、両列を検索することはできません。 (ただし、`major`列のみであれば、上記のインデックスを使用して検索できます。)

複数列インデックスは、慎重に使用する必要があります。 多くの場合、単一列のインデックスで十分であり、また、その方がディスク領域と時間を節約できます。 テーブルの使用方法が極端に様式化されていない限り、3つ以上の列を使用しているインデックスは、ほぼ間違いなく不適切であると言えます。

前のページ | ホーム | 次のページ
インデックスの種類 | 上に戻る | 一意インデックス