Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PostgreSQL 9.2:citext上的GIN索引[]_Postgresql_Indexing - Fatal编程技术网

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