各インデックスメソッドは、pg_am
システムカタログ(「pg_am
」を参照)内の行によって記述されます。
pg_am
行の主な内容は、アクセスメソッドで提供されるインデックスアクセス関数を識別するpg_proc
項目への参照です。
本章の後でこの関数用のAPIを定義します。
pg_am
行はさらに、複数列のインデックスをサポートするかなどといった、アクセスメソッドの固定属性をいくつか規定します。
現時点では、pg_am
項目の作成や削除に関する特別な補助はありません。
新しいアクセスメソッドを作成することができる人間ならば、適切な行を挿入できる能力があると想定しています。
使い易くするために、インデックスアクセスメソッドはまた、pg_opfamily
、pg_opclass
、pg_amop
およびpg_amproc
内で定義される、複数の演算子族と演算子クラスを持ちます。
これらの項目により、プランナは、このアクセスメソッドのインデックスがどのような問い合わせ条件に対して使用できるかを決定することができます。
演算子族と演算子クラスについては、「インデックス拡張機能へのインタフェース」で説明します。
これは本章を読む上で必要となる資料です。
個々のインデックスは、インデックスを物理的なリレーションとして記述するpg_class
項目と、インデックスの論理的な内容、つまり、インデックスが持つインデックス列の集合とその列の意味を、関連する演算子クラスで再現されたものとして表すpg_index
項目とで定義されます。
インデックス列(キー値)は、背後のテーブルの単純な列、あるいは、テーブル行に対する式とすることができます。
通常、インデックスアクセスメソッドはインデックスキー値が何を表すかについて考慮しません。
(常に計算済みのキー値として扱われます。)
しかし、pg_index
内の演算子クラスの情報を深く考慮します。
この両方のカタログ項目は、インデックスに対するすべての操作に渡されるRelation
データ構造の一部としてアクセスすることができます。
pg_am
のフラグ列の中には、明確な意味を持たないものがあります。
amcanunique
の必要条件は「インデックス一意性検査」で説明されています。
amcanmulticol
フラグはアクセスメソッドが複数列に対するインデックスをサポートすることを表し、amoptionalkey
は、インデックス可能な制限句が最初のインデックス列に指定されていないスキャンを許可することを表します。
amcanmulticol
が偽の場合、amoptionalkey
は基本的に、アクセスメソッドが制限句なしで完全なインデックススキャンをサポートするかどうかを表します。
複数列に対するインデックスをサポートするアクセスメソッドは、最初の列以降のすべてまたは一部の列に関する制限がなくてもスキャンをサポートしなければなりません。
しかし、最初のインデックス列にいくつかの制限を要求することは認められています。
これは、amoptionalkey
を偽に設定することで通知されます。
インデックスアクセスメソッドがamoptionalkey
を偽にする1つの理由は、NULLをインデックス付けしない場合です。
ほとんどのインデックス可能な演算子は厳密で、NULL値の入力に対して真を返すことができませんので、NULLに対してインデックス項目を格納しないことは一見魅力的です。
これはインデックススキャンによって何も返しません。
しかし、最初のインデックス列に対する制限がないインデックススキャンでは、この引数は失敗します。
プランナがこうしたスキャンキーをまったく持たないインデックスを使用することを決定する可能性がありますので、実際これは、amoptionalkey
が真のインデックスはNULLインデックスを持たなければならないことを意味します。
関連する制限として、プランナはこれらの列を制限しない問い合わせでインデックスを使用できることを前提とするため、複数のインデックス列をサポートするインデックスアクセスメソッドは1番目の後の列でNULL値のインデックスをサポートしなければならないということがあります。
例えば、(a,b)に対するインデックスに、WHERE a = 4
という条件で問い合わせを行うことを考えてみます。
システムは、このインデックスをa = 4
を持つ行をスキャンすることに使用できるものと仮定します。
これはもし、b
がNULLの場合の行をインデックスが省略する場合は間違っています。
しかし、最初のインデックス列がNULLの場合に行を省略することは問題ありません
また、NULLをインデックス付けするインデックスアクセスメソッドはamsearchnulls
を設定する可能性があります。
これは検索条件としてIS NULL
およびIS NOT NULL
句をサポートすることを示します。