PostgreSQL 9.1.5文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 52章インデックスアクセスメソッドのインタフェース定義 | 早送り | 次のページ |
各インデックスメソッドは、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の必要条件は項52.5で説明されています。 amcanmulticolフラグはアクセスメソッドが複数列に対するインデックスをサポートすることを表し、amoptionalkeyは、インデックス可能な制限句が最初のインデックス列に指定されていないスキャンを許可することを表します。 amcanmulticolが偽の場合、amoptionalkeyは基本的に、アクセスメソッドが制限句なしで完全なインデックススキャンをサポートするかどうかを表します。 複数列に対するインデックスをサポートするアクセスメソッドは、最初の列以降のすべてまたは一部の列に関する制限がなくてもスキャンをサポートしなければなりません。 しかし、最初のインデックス列にいくつかの制限を要求することは認められています。 これは、amoptionalkeyを偽に設定することで通知されます。 インデックスアクセスメソッドがamoptionalkeyを偽にする1つの理由は、NULLをインデックス付けしない場合です。 ほとんどのインデックス可能な演算子は厳密で、NULL値の入力に対してTRUEを返すことができませんので、NULLに対してインデックス項目を格納しないことは一見魅力的です。 これはインデックススキャンによって何も返しません。 しかし、最初のインデックス列に対する制限がないインデックススキャンでは、この引数は失敗します。 プランナがこうしたスキャンキーをまったく持たないインデックスを使用することを決定する可能性がありますので、実際これは、amoptionalkeyが真のインデックスはNULLインデックスを持たなければならないことを意味します。 関連する制限として、プランナはこれらの列を制限しない問い合わせでインデックスを使用することができると前提とするため、複数のインデックス列をサポートするインデックスアクセスメソッドは1番目の後の列でNULL値のインデックスをサポートしなければならないということがあります。 例えば、(a,b)に対するインデックスに、WHERE a = 4という条件で問い合わせを行うことを考えてみます。 システムは、このインデックスをa = 4を持つ行をスキャンすることに使用できるものと仮定します。 これはもし、bがNULLの場合の行をインデックスが省略する場合は間違っています。 しかし、最初のインデックス列がNULLの場合に行を省略することは問題ありません また、NULLをインデックス付けするインデックスアクセスメソッドはamsearchnullsを設定する可能性があります。 これは検索条件としてIS NULLおよびIS NOT NULL句をサポートすることを示します。