PostgreSQL 9.2:citext上的GIN索引[]
我需要加速此查询:PostgreSQL 9.2:citext上的GIN索引[],postgresql,indexing,Postgresql,Indexing,我需要加速此查询: SELECT * FROM mytable WHERE 'value' = ANY("citext_array_col") LIMIT 1; 其中citext\u array\u col是citext的数组。我试图创建一个操作符类: CREATE OPERATOR CLASS gin__citext_ops FOR TYPE citext[] USING gin AS OPERATOR 6 = (anyarray, anyarr
SELECT * FROM mytable
WHERE 'value' = ANY("citext_array_col") LIMIT 1;
其中citext\u array\u col
是citext的数组。我试图创建一个操作符类:
CREATE OPERATOR CLASS gin__citext_ops
FOR TYPE citext[] USING gin
AS
OPERATOR 6 = (anyarray, anyarray),
FUNCTION 1 citext_cmp (citext, citext),
FUNCTION 2 ginarrayextract(anyarray, internal, internal),
FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE citext;
我可以用这个操作符类创建GIN索引,但它没有用(使用设置enable_seqscan=off
规划器仍然使用顺序扫描)。我不知道ginqueryarrayextract()和co.做什么,没有关于这方面的文档
我发现的是GIN索引的intarray扩展,但是代码是用C编写的,我对PG C扩展不太熟悉
有没有更智能的方法来创建此查询的索引?可能使用文本支持函数?我相信您想要的是这样声明运算符类:
CREATE OPERATOR CLASS _citext_ops DEFAULT FOR TYPE citext[] USING gin
AS
OPERATOR 3 && (anyarray, anyarray),
OPERATOR 6 = (anyarray, anyarray),
OPERATOR 7 @> (anyarray, anyarray),
OPERATOR 8 <@ (anyarray, anyarray),
FUNCTION 1 citext_cmp (citext, citext),
FUNCTION 2 ginarrayextract(anyarray, internal, internal),
FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE citext;
还要确保使用gin创建了正确的索引:
CREATE INDEX idxfoo ON mytable USING gin (citext_array_col);
这将查找citext_数组_col在任何元素中包含“value”的所有行。“&&”运算符是重叠运算符。看
(编辑:type-o)给出了
uuid
的答案,该答案可能适用于citext
citext的操作符类(根据Florent Guillaume的建议改编)如下:
CREATE OPERATOR CLASS _citext_ops DEFAULT
FOR TYPE _citext USING gin AS
OPERATOR 1 &&(anyarray, anyarray),
OPERATOR 2 @>(anyarray, anyarray),
OPERATOR 3 <@(anyarray, anyarray),
OPERATOR 4 =(anyarray, anyarray),
FUNCTION 1 citext_cmp(citext, citext),
FUNCTION 2 ginarrayextract(anyarray, internal, internal),
FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE citext;
仅供参考,这不会像现在这样起作用。运算符后面的数字是策略,对于仅使用策略1-4的轧棉机来说,它们是错误的。看,上面列出的策略似乎是GiST的策略。这解决了我的问题,并给出了uuid的答案。谢谢!
CREATE OPERATOR CLASS _citext_ops DEFAULT
FOR TYPE _citext USING gin AS
OPERATOR 1 &&(anyarray, anyarray),
OPERATOR 2 @>(anyarray, anyarray),
OPERATOR 3 <@(anyarray, anyarray),
OPERATOR 4 =(anyarray, anyarray),
FUNCTION 1 citext_cmp(citext, citext),
FUNCTION 2 ginarrayextract(anyarray, internal, internal),
FUNCTION 3 ginqueryarrayextract(anyarray, internal, smallint, internal, internal, internal, internal),
FUNCTION 4 ginarrayconsistent(internal, smallint, anyarray, integer, internal, internal, internal, internal),
STORAGE citext;
SELECT * FROM mytable
WHERE citext_array_col && ARRAY['value']::citext[];