2013-07-29 3 views
2

내 테이블 :PostgreSQL의 인덱스 배열 사용자 정의 연산자 클래스 여기

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

내가 인덱스에 발 열 원하는 : 나는 다음과 함께했다

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에서 오류가 발생합니다. 나는 PG, 컴퓨터를 재부팅 시도하고이 문제를 해결하기 위해

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

하고 DB를 진공 청소기로 청소 :

"ERROR: cache lookup failed for type 1"

나는이 시도했다. CREATE OPERATOR 코드에 오류가 있다고 생각합니다.

(int, int4range) 사용자 정의 유형의 배열을 색인화 할 수 있다면 더 좋을 것입니다.

문서, 포럼 등을 통해 꽤 오랜 시간을 보냈지 만이를 해결하는 방법을 이해하는 데 도움이되는 것은 없습니다. 즉, 작동하는 사용자 지정 연산자 클래스를 만드는 데 도움이되는 것은 없습니다.

답변

2

당신은 예를 들어, Range Functions and Operators에 따라 CREATE 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

을개
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