PostgreSQL 9.0.4文書 | ||||
---|---|---|---|---|
前のページ | 巻戻し | 第 53章GINインデックス | 早送り | 次のページ |
GINは完全なインデックススキャンをサポートしません。
extractValue
が、例えば、空の文字列や空の配列が発生するといったゼロキーを返すことが許されていることがこの理由です。
こうした場合、インデックス付けされた値がインデックス内で表現されないことになります。
したがってGINでは、インデックスのスキャンによりテーブル内のすべての行を見つけることができることを保証することは不可能です。
この制限のため、extractQuery
はすべての値が問い合わせに一致したことを示すnkeys = 0を返す時、GINはエラーになります。
(問い合わせ内でインデックス付け可能な演算子を複数論理積で使用している場合、これはすべての演算子でnkeysが0を返した時のみに起こります。)
演算子クラスでは完全インデックススキャンに対する制限を回避することができます。
このためには、extractValue
は少なくとも1つのキー(ダミーで構いません)をインデックス付けされた値すべてに対して返さなければなりません。
そしてextractValue
は制限のない検索をインデックス全体をスキャンする部分一致問い合わせに変換しなければなりません。
これは非効率的ですが、LIKEや部分集合の含有のような演算子における境界失敗を防ぐために必要になるかもしれません。
GINは、インデックス付け可能な演算子は厳密であると仮定します。
これはextractValue
はNULL値についてはまったく呼び出されない(そのためその値はインデックス付けされない)こと、および、extractQuery
はNULLと値を比較する場合に呼び出されない(代わりに問い合わせは不一致であるとみなされる)ことを意味します。
ありうるより深刻な制限は、GINはNULLキーを操作できないことで、例えば、NULLを含む配列は、NULLを無視する以外操作できません。