Postgresql 为什么Postgres Hstore索引适用于?(操作员)和不存在(功能)?

Postgresql 为什么Postgres Hstore索引适用于?(操作员)和不存在(功能)?,postgresql,indexing,hstore,Postgresql,Indexing,Hstore,国家: 然而,索引似乎相当于?运算符 运算符和函数之间的区别是什么,使得索引一个或另一个更难 Hstore扩展的未来版本会使这些功能真正等效吗?这是您的问题:PostgreSQL函数是planner不透明的。计划者无法知道操作符和函数在语义上是等价的。这件事经常发生 PostgreSQL确实有函数索引,因此您可以为不可变函数的输出编制索引,但这并不能使这里的工作完全正常,因为您可能只能为给定调用返回true的行编制索引,但这对于部分索引仍然非常有用。例如,您可以随时执行以下操作: CREATE

国家:

然而,索引似乎相当于
运算符

运算符和函数之间的区别是什么,使得索引一个或另一个更难


Hstore扩展的未来版本会使这些功能真正等效吗?

这是您的问题:PostgreSQL函数是planner不透明的。计划者无法知道操作符和函数在语义上是等价的。这件事经常发生

PostgreSQL确实有函数索引,因此您可以为不可变函数的输出编制索引,但这并不能使这里的工作完全正常,因为您可能只能为给定调用返回true的行编制索引,但这对于部分索引仍然非常有用。例如,您可以随时执行以下操作:

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

但我看不出这正是你所需要的。希望它能为你指明正确的方向

编辑:以下是一个更好的解决方法。假设我们有一个表foo:

 CREATE TABLE foo (
        id serial,
        bar hstore
 );
我们可以创建一个表方法bar_键:

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'];

应该使用索引。请注意,您可以直接索引/使用akeys,但我认为虚拟列会带来更清晰的语法。

请查阅文档中的“创建运算符类”,其中描述了如何为任意运算符创建索引方法。您还需要首先使用“CREATE OPERATOR”基于EXIST函数创建一个操作符

(注意:我没有使用hstore的经验)


EXISTS不是一个函数,而是一个关系运算符。
存在(…)
子库中有什么?(可能是您提到的运算符之一)例如,
SELECT*FROM foo WHERE bar?“aaa'
将使用索引,但
从存在的foo中选择*(条形,'aaa')
将不使用-即使查询在其他方面是功能等价的,实际上有一个名为
存在的函数
,或者你是说
EXISTS
操作符?hstore扩展定义了函数
EXIST
-请在hstore contrib源代码中找到一种方法,将它们标记为等效的,或者在没有用户干预的情况下故意启用索引?不。我一直在考虑这个问题。我将用另一个更好的解决方法更新我的答案。那么你认为hstore贡献者之所以不这样做是因为
EXIST
?正如我所说的,我不知道hstore的具体情况,但通过浏览它,可能是运营商?正在以正确的方式包装exist函数。请注意,在一般情况下,函数不能用于索引,因为它们可能是不确定的,并且依赖于非参数数据,并且只有运算符提供索引使用所需的元数据
 CREATE INDEX foo_bar_keys_idx ON foo USING gin(bar_keys(foo));
  SELECT * FROM foo WHERE foo.bar_keys @> array['aaa'];