制限

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

# 53.5. 制限

GINは完全なインデックススキャンをサポートしません。 `extractValue`が、例えば、空の文字列や空の配列が発生するといったゼロキーを返すことが許されていることがこの理由です。 こうした場合、インデックス付けされた値がインデックス内で表現されないことになります。 したがってGINでは、インデックスのスキャンによりテーブル内のすべての行を見つけることができることを保証することは不可能です。

この制限のため、`extractQuery`はすべての値が問い合わせに一致したことを示す`nkeys = 0`を返す時、GINはエラーになります。 （問い合わせ内でインデックス付け可能な演算子を複数論理積で使用している場合、これはすべての演算子で`nkeys`が0を返した時のみに起こります。）

演算子クラスでは完全インデックススキャンに対する制限を回避することができます。 このためには、`extractValue`は少なくとも1つのキー（ダミーで構いません）をインデックス付けされた値すべてに対して返さなければなりません。 そして`extractValue`は制限のない検索をインデックス全体をスキャンする部分一致問い合わせに変換しなければなりません。 これは非効率的ですが、`LIKE`や部分集合の含有のような演算子における境界失敗を防ぐために必要になるかもしれません。

GINは、インデックス付け可能な演算子は厳密であると仮定します。 これは`extractValue`はNULL値についてはまったく呼び出されない（そのためその値はインデックス付けされない）こと、および、`extractQuery`はNULLと値を比較する場合に呼び出されない（代わりに問い合わせは不一致であるとみなされる）ことを意味します。

ありうるより深刻な制限は、GINはNULLキーを操作できないことで、例えば、NULLを含む配列は、NULLを無視する以外操作できません。

前のページ | ホーム | 次のページ
GINの小技 | 上に戻る | 例