2013-07-29 28 views
2

这里是我的表:PostgreSQL的指数阵列 - 运营商定制类

CREATE TABLE 
     mytable 
     (
       id  INT NOT NULL PRIMARY KEY, 
       val  int4range[] 
     ); 

我想索引的VAL列:

CREATE INDEX 
    ix_mytable_val 
ON  mytable 
USING GIN (INT4RANGE(val, '[]')); // error, as is GIN(val) 

我想出了以下内容:

CREATE OPERATOR CLASS gin_int4range_ops 
DEFAULT FOR TYPE int4range[] USING gin AS 
OPERATOR  1  <(anyrange,anyrange), 
OPERATOR  2  <=(anyrange,anyrange), 
OPERATOR  3  =(anyrange,anyrange), 
OPERATOR  4  >=(anyrange,anyrange), 
OPERATOR  5  >(anyrange,anyrange), 
FUNCTION  1  lower(anyrange), 
FUNCTION  2  upper(anyrange), 
FUNCTION  3  isempty(anyrange), 
FUNCTION  4  lower_inc(anyrange), 
FUNCTION  5  upper_inc(anyrange); 

但是,当我尝试创建索引,它失败(错误如下)。但是,如果我从DO $$块中调用create,它会执行。

如果创建索引执行,我得到INSERT INTO上的错误,而不是。

"ERROR: cache lookup failed for type 1"

我也试过这样:

OPERATOR  1  &&(anyrange,anyrange), 
OPERATOR  2  <@(anyrange,anyrange), 
OPERATOR  3  @>(anyrange,anyrange), 
OPERATOR  4  =(anyrange,anyrange), 

为了试图解决这个问题,我已经重新启动PG,机器,并用吸尘器DB。我相信在CREATE OPERATOR代码中有一个错误。

如果我可以索引自定义类型(int,int4range)的数组,那会更好。

我花了相当一段时间(整整一天)在文档,论坛等等中涉水,但没有找到真正有助于我理解如何解决这个问题(即创建一个自定义操作员类)的东西。

回答

2

你需要基于Range Functions and OperatorsCREATE OPERATOR CLASS,例如:

CREATE OPERATOR CLASS gin_int4range_ops 
    DEFAULT FOR TYPE int4range[] USING gin AS 
     OPERATOR  1  =(anyrange,anyrange), 
     FUNCTION  1  lower(anyrange), 
     FUNCTION  2  upper(anyrange), 
     FUNCTION  3  isempty(anyrange), 
     FUNCTION  4  lower_inc(anyrange), 
     FUNCTION  5  upper_inc(anyrange); 

现在你可以CREATE INDEX

CREATE INDEX ix_mytable4_vhstore_low 
ON mytable USING gin (val gin_int4range_ops); 

检查也:
Operator Classes and Operator Families
CREATE OPERATOR CLASS

The following query shows all defined operator classes:

SELECT am.amname AS index_method, 
     opc.opcname AS opclass_name 
    FROM pg_am am, pg_opclass opc 
    WHERE opc.opcmethod = am.oid 
    ORDER BY index_method, opclass_name; 

This query shows all defined operator families and all the operators included in each family:

SELECT am.amname AS index_method, 
     opf.opfname AS opfamily_name, 
     amop.amopopr::regoperator AS opfamily_operator 
    FROM pg_am am, pg_opfamily opf, pg_amop amop 
    WHERE opf.opfmethod = am.oid AND 
      amop.amopfamily = opf.oid 
    ORDER BY index_method, opfamily_name, opfamily_operator; 
+0

谢谢了!当我尝试创建索引时,出现“错误:类型1的缓存查找失败”。我确实重新启动了服务器。有任何想法吗? – IamIC

+1

你的代码在我的数据库中运行正常...试图找出。 – revoua

+0

我试过了我能想到的所有东西,但仍然得到这个错误。 – IamIC