4

http://www.postgresql.org/docs/9.2/static/hstore.htmlの状態:

hstore has GiST and GIN index support for the @>, ?, ?& and ?| operators

ただし、関数のインデックスは機能しませんEXIST?。これは、演算子と同等のようです。

演算子と関数の違いで、どちらか一方のインデックスを作成するのが難しくなっていますか?

Hstore拡張機能の将来のバージョンは、これらを本当に同等にする可能性がありますか?

4

2 に答える 2

2

任意の演算子のインデックス付けメソッドを作成する方法を説明している「CREATEOPERATORCLASS」のドキュメントを検索してください。また、「CREATE OPERATOR」を使用して、最初にEXIST関数に基づいて演算子を作成する必要があります。

(警告:私はhstoreの経験がありません)

http://www.postgresql.org/docs/9.0/static/sql-createoperator.html

http://www.postgresql.org/docs/9.0/static/sql-createopclass.html

于 2013-02-04T14:30:06.910 に答える
1

ここにあなたの問題があります:PostgreSQL関数はplanner-opaqueです。プランナーには、演算子と関数が意味的に同等であることを知る方法がありません。これはたくさん出てきます。

PostgreSQLには機能インデックスがあるため、不変関数の出力にインデックスを付けることができますが、特定の呼び出しに対してtrueを返す行のみにインデックスを付けることができるため、ここでは完全に機能しない可能性がありますが、これは非常に便利です。部分インデックス付き。たとえば、次のようなことを常に行うことができます。

CREATE INDEX bar_has_aaa ON foo(exists(bar, 'aaa'));

また

CREATE INDEX bar_has_aaa ON foo(id) where exists (bar, 'aaa');

しかし、私はこれがあなたがそれを行くのに必要なところに正確に行くとは思いません。うまくいけば、それはあなたを正しい方向に向けます。

編集:以下は、より良い回避策として私を襲います。テーブルfooがあるとします。

 CREATE TABLE foo (
        id serial,
        bar hstore
 );

テーブルメソッドbar_keysを作成できます。

CREATE FUNCTION bar_keys(foo) RETURNS text[] IMMUTABLE LANGUAGE SQL AS $$
    SELECT akeys($1.bar);
$$;

次に、GINを使用してインデックスを作成できます。

 CREATE INDEX foo_bar_keys_idx ON foo USING gin(bar_keys(foo));

そして、それをクエリで使用できます。

  SELECT * FROM foo WHERE foo.bar_keys @> array['aaa'];

インデックスを使用する必要があります。キーを直接インデックス付け/使用することもできますが、仮想列はよりクリーンな構文につながると思います。

于 2013-01-30T06:41:18.723 に答える