http://www.postgresql.org/docs/9.2/static/hstore.html网站上写道:
hstore has GiST and GIN index support for the @>, ?, ?& and ?| operators
然而,索引不适用于EXIST
函数,这似乎等同于?
运算符。
运算符和函数有何区别,使得其中一个更难索引?
未来的Hstore扩展版本是否会使它们真正等效?
http://www.postgresql.org/docs/9.2/static/hstore.html网站上写道:
hstore has GiST and GIN index support for the @>, ?, ?& and ?| operators
然而,索引不适用于EXIST
函数,这似乎等同于?
运算符。
运算符和函数有何区别,使得其中一个更难索引?
未来的Hstore扩展版本是否会使它们真正等效?
http://www.postgresql.org/docs/9.0/static/sql-createoperator.html
http://www.postgresql.org/docs/9.0/static/sql-createopclass.html
EXIST
做这件事情是有原因的吗? - Seamus Abshere这是您的问题:PostgreSQL函数是规划器不透明的。规划器无法知道运算符和函数在语义上是等价的。这经常出现。
PostgreSQL确实有功能索引,因此您可以对不可变函数的输出建立索引,但这可能不能完美地使事情正常工作,因为您可能只能索引返回给定调用的true行,但这仍然可以通过部分索引非常有用。例如,您始终可以执行类似以下的操作:
CREATE INDEX bar_has_aaa ON foo(exists(bar, 'aaa'));
或者
CREATE INDEX bar_has_aaa ON foo(id) where exists (bar, 'aaa');
CREATE TABLE foo (
id serial,
bar hstore
);
CREATE FUNCTION bar_keys(foo) RETURNS text[] IMMUTABLE LANGUAGE SQL AS $$
SELECT akeys($1.bar);
$$;
CREATE INDEX foo_bar_keys_idx ON foo USING gin(bar_keys(foo));
而且我们可以在查询中使用它:
SELECT * FROM foo WHERE foo.bar_keys @> array['aaa'];
这应该使用索引。请注意,您可以直接索引/使用 akeys,但我认为虚拟列会导致更清晰的语法。
EXISTS(...)
子查询中有什么?(可能是您提到的运算符之一) - wildplasserEXIST
的函数吗?还是你指的是EXISTS
运算符? - wildplasserEXIST
- 请查阅技术手册。 - Seamus Abshere