ここにあなたの問題があります: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'];
インデックスを使用する必要があります。キーを直接インデックス付け/使用することもできますが、仮想列はよりクリーンな構文につながると思います。