インデックス用のカタログ項目

PostgreSQL 9.0.0文書
前のページ | 巻戻し | 第 51章インデックスアクセスメソッドのインタフェース定義 | 早送り | 次のページ

# 51.1. インデックス用のカタログ項目

各インデックスメソッドは、`pg_am`システムカタログ（項45.3を参照）内の行によって記述されます。 `pg_am`行の主な内容は、アクセスメソッドで提供されるインデックスアクセス関数を識別する`pg_proc`項目への参照です。 本章の後でこの関数用のAPIを定義します。 `pg_am`行はさらに、複数列のインデックスをサポートするかなどといった、アクセスメソッドの固定属性をいくつか規定します。 現時点では、`pg_am`項目の作成や削除に関する特別な補助はありません。 新しいアクセスメソッドを作成することができる人間ならば、適切な行を挿入できる能力があると想定しています。

使い易くするために、インデックスアクセスメソッドはまた、`pg_opfamily`、`pg_opclass`、`pg_amop`および`pg_amproc`内で定義される、複数の演算子族と演算子クラスを持ちます。 これらの項目により、プランナは、このアクセスメソッドのインデックスがどのような問い合わせ条件に対して使用できるかを決定することができます。 演算子族と演算子クラスについては、項35.14で説明します。 これは、本章を読む上で必要となる事柄です。

個々のインデックスは、インデックスを物理的なリレーションとして記述する`pg_class`項目と、インデックスの論理的な内容、つまり、インデックスが持つインデックス列の集合とその列の意味を、関連する演算子クラスで再現されたものとして表す`pg_index`項目とで定義されます。 インデックス列（キー値）は、背後のテーブルの単純な列、あるいは、テーブル行に対する式とすることができます。 通常、インデックスアクセスメソッドはインデックスキー値が何を表すかについて考慮しません。 （常に計算済みのキー値として扱われます。） しかし、`pg_index`内の演算子クラスの情報を深く考慮します。 この両方のカタログ項目は、インデックスに対するすべての操作に渡される`Relation`データ構造の一部としてアクセスすることができます。

`pg_am`のフラグ列の中には、明確な意味を持たないものがあります。 `amcanunique`の必要条件は項51.5で説明されています。 `amcanmulticol`フラグはアクセスメソッドが複数列に対するインデックスをサポートすることを表し、`amoptionalkey`は、インデックス可能な制限句が最初のインデックス列に指定されていないスキャンを許可することを表します。 `amcanmulticol`が偽の場合、`amoptionalkey`は基本的に、アクセスメソッドが制限句なしで完全なインデックススキャンを許可するかどうかを表します。 複数列に対するインデックスをサポートするアクセスメソッドは、最初の列以降のすべてまたは一部の列に関する制限がなくてもスキャンをサポートしなければなりません。 しかし、最初のインデックス列にいくつかの制限を要求することは認められています。 これは、`amoptionalkey`を偽に設定することで通知されます。 `amindexnulls`は、インデックス項目がNULLキー値に対して作成されることを表します。 ほとんどのインデックス可能な演算子は厳密で、NULL値の入力に対してTRUEを返すことができませんので、NULLに対してインデックス項目を格納しないことは一見魅力的です。 これはインデックススキャンによって何も返しません。 しかし、最初のインデックス列に対する制限がないインデックススキャンでは、この引数は失敗します。 プランナがこうしたスキャンキーをまったく持たないインデックスを使用することを決定する可能性がありますので、実際これは、`amoptionalkey`が真のインデックスはNULLインデックスを持たなければならないことを意味します。 関連する制限として、プランナはこれらの列を制限しない問い合わせでインデックスを使用することができると前提とするため、複数のインデックス列をサポートするインデックスアクセスメソッドは1番目の後の列でNULL値のインデックスをサポートしなければならないということがあります。 例えば、(a,b)に対するインデックスに、`WHERE a = 4`.という条件で問い合わせを行うことを考えてみます。 システムは、このインデックスを`a = 4`を持つ行をスキャンすることに使用できるものと仮定します。 これはもし、`b`がNULLの場合の行をインデックスが省略する場合は間違っています。 しかし、最初のインデックス列がNULLの場合に行を省略することは問題ありません したがって、インデックスアクセスメソッドが任意のNULL値の組み合わせを含む、すべての行に対してインデックスを行う場合にのみ、`amindexnulls`を真にしなければなりません。 また、`amindexnulls`を設定したインデックスアクセスメソッドは`amsearchnulls`を設定する可能性があります。 これは検索条件として`IS NULL`および`IS NOT NULL`句をサポートすることを示します。

前のページ | ホーム | 次のページ
インデックスアクセスメソッドのインタフェース定義 | 上に戻る | インデックスアクセスメソッド関数