CREATE OPERATOR CLASS — 새 연산자 클래스 정의
CREATE OPERATOR CLASS이름
[ DEFAULT ] FOR TYPE자료형
USING색인방법
[ FAMILY가족이름
] AS { OPERATOR전략번호
연산자이름
[ (연산자자료형
,연산자자료형
) ] [ FOR SEARCH | FOR ORDER BYsort_family_name
] | FUNCTION지원번호
[ (연산자자료형
[ ,연산자자료형
] ) ]함수이름
(인자자료형
[, ...] ) | STORAGE저장자료형
} [, ... ]
CREATE OPERATOR CLASS
명령은 새 연산자 클래스를 만든다.
연산자 클래스란 한 인덱스에서 특정 자료형이 어떻게 사용되는지 정의한
연산자와 함수들의 모음입니다.
연산자 클래스에서는 특정 자료형과 특정 색인 방법에서 사용할 수 있는
연산자와 그 “전략” 정보를 지정한다.
또한 한 인덱스 칼럼용으로 선택된 연산자 클래스를 이용해서
그 색인 방법의 인덱스를 처리할 때 지원할 함수들을 지정한다.
여기서 지정하는 모든 연산자와 함수는 해당 연산자 클래스를 만들기
전에 이미 해당 데이터베이스에 있어야 한다.
연산자 클래스 이름으로 스키마 이름을 포함하면, 해당 스키마 안에 만든다. 스키마 이름을 생량하면, 현재 스키마 안에 만든다. 같은 스키마 안에 같은 연산자 클래스를 만들 때는 그 색인 방법이 달라야 한다.
이 명령을 실행하는 사용자가 해당 연산자 클래스의 소유주가 된다. 현재, 이 명령은 슈퍼유저만 실행할 수 있다. (잘못 만들어진 연산자 클래스가 사용되면 서버가 비정상 종료될 가능성이 있어, 이런 제한을 둔다.)
CREATE OPERATOR CLASS
작업에서
해당 색인 방법으로 사용할 모든 연산자와 함수를 포함하고 있는지는
확인하지 않으며, 또한 각 연산자와 함수가 색인 방법에 맞게
작동하는지에 대한 검사도 하지 않는다. 이 확인은 연산자 클래스를
만드는 사용자가 해야할 일이다.
연관된 연산자 클래스는 연산자 가족으로 묶을 수 있다.
이미 있는 연산자 가족에 해당 연산자 클래스를 포함하려면,
CREATE OPERATOR CLASS
명령에서
FAMILY
옵션을 이용한다.
이 옵션을 사용하지 않으면, 해당 연산자 클래스 이름과 같은
연산자 가족안에 포함된다. (해당 연산자 가족이 없으면 만든다.)
보다 자세한 내용은 37.16절에서 다룬다.
name
새로 만들 연산자 클래스 이름. 스키마 이름을 포함 할 수 있음.
DEFAULT
이 옵션을 사용하면, 해당 자료형의 기본 연산자 클래스로 지정한다. 특정 자료형과 특정 색인 방법에 대한 기본 연산자 클래스는 하나만 지정할 수 있다.
자료형
새로 만들 연산자 클래스가 사용될 대상 자료형.
색인방법
새로 만들 연산자 클래스가 사용될 색인 방법.
가족이름
해당 연산자 클래스가 포함될 연산자 가족 이름. 지정하지 않으면, 연산자 클래스와 같은 이름의 연산자 가족이 사용되며, 그 연산자 가족이 없으면 새로 만든다.
전략번호
해당 연산자 클래스와 관련된 연산자의 색인 방법 전략 번호.
연산자이름
연산자 클래스 소속 연산자 이름(스키마 이름 포함).
연산자자료형
OPERATOR
옵션에서는
해당 연산자가 사용하는 자료형으로, 단항 연산자인 경우,
필요 없는 부분에는 NONE
. 일반적으로 해당 연산자가
연산자 클래스의 대상 자료형과 같은 경우라면 이 연산자 자료형은 생략한다.
FUNCTION
옵션에서는
해당 함수가 사용하는 자료형이다.
보통, B-tree 비교 함수나, 해시 함수이 경우는 해당 연산자 클래스
대상 자료형과 다르게 사용된다. 이 때 지정한다.
B-tree 정렬 지원 함수, B-tree 동등 이미지 함수,
GiST, SP-GiST, GIN, BRIN 연산자 클래스의
모든 함수는 연산자 클래스 대상 자료형을 사용한다.
이 경우는 이 이 연산자 자료형을 지정할 필요는 없다.
단, B-tree 정렬 지원 함수인데, 교차 자료형 비교인 경우는
이 연산자 자료형을 지정할 필요가 있다.
sort_family_name
정렬 연산과 관련된 작업을 지정한 이미 있는 btree
연산자 가족 이름(스키마 이름 포함).
FOR SEARCH
, FOR ORDER BY
둘 다 사용하지 않으면,
FOR SEARCH
옵션으로 간주한다.
지원번호
해당 연산자 클래스와 관련된 색인 방법의 해당 함수에 대한 지원 함수 번호.
함수이름
해당 연산자 클래스용 색인 방법 지원 함수로 쓸 함수 이름 (스키마 이름 포함).
인자자료형
해당 함수의 입력 인자 자료형.
저장자료형
인덱스에 저장될 실제 자료형. 일반적으로
해당 연산자 클래스 대상 자료형과 같지만,
몇 색인 방법(현재, GiST, GIN, BRIN)은 다른 자료형도 허용한다.
이렇게 연산자 클래스 대상 자료형과 같은 경우는
STORAGE
옵션을 사용하지 말아야하며, 다른 경우만
지정해야 한다.
연산자 클래스의 자료형
으로
anyarray
형을 지정했다면,
저장자료형
으로
anyelement
형을 지정해서, 그 배열의 한 요소임을 지정할
수 있다.
OPERATOR
, FUNCTION
, 및 STORAGE
절은 그 순서에 상관 없이 사용할 수 있다.
연산자 클래스에 지정한 함수나 연산자는 그 연산자 클래스를 사용하는 인덱스 관련 작업을 하는 그 때 접근 권한을 검사한다. 이렇기 때문에, 연산자 클래스의 접근 권한은 누구나 실행할 수 있도록 한다. 이 기본 정책은 일반적인 상황에서는 특별히 문제되지 않는다.
연산자는 SQL 함수로 만들지 말아야 한다. SQL 함수로 만들면, 해당 쿼리가 실행 될 때, 그 함수에서 정의한 SQL 구문으로 변환해서 쿼리를 실행하기 때문에, 실행 계획 최적화기가 인덱스 사용 여부에 대한 판단을 잘못할 수 있기 때문이다.
PostgreSQL 8.4 이전 버전에서는
OPERATOR
구문에서 RECHECK
옵션을 사용할 수 있었으나,
지금은 빠졌다. 이제는 인덱스 연산자는 그것을 사용할 때마다
항상 확인하기 때문이다.
This allows efficient handling of
cases where an operator might or might not be lossy.
다음은 _int4
(int4
배열) 자료형을 위한
GiST 인덱스 연산자 클래스를 정의한 예제다. 이 부분의 전체 예제는
intarray 확장 모듈에서 다룬다.
CREATE OPERATOR CLASS gist__int_ops DEFAULT FOR TYPE _int4 USING gist AS OPERATOR 3 &&, OPERATOR 6 = (anyarray, anyarray), OPERATOR 7 @>, OPERATOR 8 <@, OPERATOR 20 @@ (_int4, query_int), FUNCTION 1 g_int_consistent (internal, _int4, smallint, oid, internal), FUNCTION 2 g_int_union (internal, internal), FUNCTION 3 g_int_compress (internal), FUNCTION 4 g_int_decompress (internal), FUNCTION 5 g_int_penalty (internal, internal, internal), FUNCTION 6 g_int_picksplit (internal, internal), FUNCTION 7 g_int_same (_int4, _int4, internal);
CREATE OPERATOR CLASS
구문은
PostgreSQL 확장 기능이다. 표준
SQL에는 CREATE OPERATOR CLASS
구문이 없다.