CREATE OPERATOR CLASS
CREATE OPERATOR CLASS
새 연산자 클래스(operator class)를 정의하는 명령이에요. 특정 데이터 타입이 인덱스에서 어떤 연산자, 어떤 지원 함수와 함께 쓰일지를 정해주는 정의입니다.
출처: PostgreSQL 문서
본문
문법 (Synopsis)
CREATE OPERATOR CLASS name [ DEFAULT ] FOR TYPE data_type
USING index_method [ FAMILY family_name ] AS
{ OPERATOR strategy_number operator_name [ ( op_type, op_type ) ] [ FOR SEARCH | FOR ORDER BY sort_family_name ]
| FUNCTION support_number [ ( op_type [ , op_type ] ) ] function_name ( argument_type [, ...] )
| STORAGE storage_type
} [, ... ]
설명 (Description)
CREATE OPERATOR CLASS는 새 연산자 클래스를 만들어요. 연산자 클래스는 특정 데이터 타입이 인덱스에서 어떻게 쓰일 수 있는지를 정의합니다. 어떤 연산자들이 이 데이터 타입과 이 인덱스 메서드에서 특정 역할, 즉 '전략(strategy)'을 담당할지를 지정하고, 인덱스 컬럼에 이 연산자 클래스가 선택됐을 때 인덱스 메서드가 사용할 지원 함수도 지정해요. 연산자 클래스가 쓰는 모든 연산자와 함수는 연산자 클래스를 만들기 전에 정의돼 있어야 합니다.
스키마 이름이 주어지면 그 스키마에 연산자 클래스가 만들어지고, 아니면 현재 스키마에 만들어집니다. 같은 스키마의 두 연산자 클래스는 서로 다른 인덱스 메서드를 위한 것일 때만 같은 이름을 가질 수 있어요.
연산자 클래스를 정의한 사용자가 그 소유자가 됩니다. 현재는 만드는 사용자가 슈퍼유저여야 해요. (잘못된 연산자 클래스 정의가 서버를 혼란에 빠뜨리거나 크래시시킬 수 있기 때문입니다.)
CREATE OPERATOR CLASS는 현재 연산자 클래스 정의가 인덱스 메서드가 요구하는 모든 연산자와 함수를 포함하는지, 또 연산자와 함수가 자기 일관적 집합을 이루는지는 검사하지 않아요. 유효한 연산자 클래스를 정의하는 것은 사용자 책임입니다.
관련 연산자 클래스들은 연산자 패밀리로 묶을 수 있어요. 기존 패밀리에 새 연산자 클래스를 추가하려면 CREATE OPERATOR CLASS에 FAMILY 옵션을 지정하세요. 이 옵션이 없으면 새 클래스는 클래스와 같은 이름의 패밀리(없으면 새로 만들어짐)에 들어갑니다.
더 자세한 내용은 36.16절을 참고하세요.
파라미터 (Parameters)
name— 만들 연산자 클래스의 이름. 스키마 한정할 수 있어요.DEFAULT— 있으면 이 연산자 클래스가 그 데이터 타입의 기본 연산자 클래스가 되어요. 특정 데이터 타입과 인덱스 메서드에 대해 기본 연산자 클래스는 최대 하나만 있을 수 있습니다.data_type— 이 연산자 클래스가 대상으로 하는 컬럼 데이터 타입.index_method— 이 연산자 클래스가 대상으로 하는 인덱스 메서드의 이름.family_name— 이 연산자 클래스를 추가할 기존 연산자 패밀리의 이름. 지정하지 않으면 연산자 클래스와 같은 이름의 패밀리(없으면 새로 만들어짐)가 사용됩니다.strategy_number— 연산자 클래스와 연관된 연산자에 대한 인덱스 메서드의 전략 번호.operator_name— 연산자 클래스와 연관된 연산자의 이름(스키마 한정 가능).op_type—OPERATOR절에서는 연산자의 피연산자 데이터 타입(들)이며, 전위 연산자를 나타내려면NONE을 써요. 연산자 클래스의 데이터 타입과 같을 때는 보통 생략할 수 있습니다.FUNCTION절에서는 함수가 지원하려는 피연산자 데이터 타입(들)인데, 함수의 입력 데이터 타입(B-트리 비교 함수와 해시 함수의 경우)이나 클래스의 데이터 타입(B-트리 정렬 지원 함수, B-트리 등가 이미지 함수, GiST·SP-GiST·GIN·BRIN 연산자 클래스의 모든 함수의 경우)과 다를 때만 지정해요. 이 기본값들이 올바르므로, B-트리 정렬 지원 함수가 교차 데이터 타입 비교를 지원하려는 경우를 빼면FUNCTION절에서op_type을 지정할 필요가 없습니다.sort_family_name— 정렬 연산자와 연관된 정렬 순서를 나타내는 기존btree연산자 패밀리의 이름(스키마 한정 가능).FOR SEARCH도FOR ORDER BY도 지정하지 않으면FOR SEARCH가 기본이에요.support_number— 연산자 클래스와 연관된 함수에 대한 인덱스 메서드의 지원 함수 번호.function_name— 연산자 클래스의 인덱스 메서드 지원 함수인 함수의 이름(스키마 한정 가능).argument_type— 함수의 파라미터 데이터 타입(들).storage_type— 인덱스에 실제로 저장되는 데이터 타입. 보통 컬럼 데이터 타입과 같지만, 일부 인덱스 메서드(현재 GiST, GIN, SP-GiST, BRIN)는 다르게 하는 걸 허용해요. 인덱스 메서드가 다른 타입을 허용할 때만STORAGE절을 넣을 수 있습니다. 컬럼data_type이anyarray로 지정되면,storage_type을anyelement로 선언해 인덱스 항목들이 각 인덱스가 만들어지는 실제 배열 타입의 원소 타입에 속함을 나타낼 수 있어요.
OPERATOR, FUNCTION, STORAGE 절은 어떤 순서로든 나타날 수 있습니다.
주의 사항 (Notes)
인덱스 기계는 함수를 사용하기 전에 접근 권한을 검사하지 않으므로, 함수나 연산자를 연산자 클래스에 포함하는 것은 그 함수에 공개 실행(exécute public) 권한을 주는 것과 같아요. 이는 연산자 클래스에 유용한 종류의 함수에서는 보통 문제가 되지 않습니다.
연산자는 SQL 함수로 정의하면 안 돼요. SQL 함수는 호출하는 쿼리에 인라인될 가능성이 높아, 옵티마이저가 쿼리가 인덱스와 일치한다는 것을 인식하지 못하게 됩니다.
예제 (Examples)
다음 예제 명령은 _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);
호환성 (Compatibility)
CREATE OPERATOR CLASS는 PostgreSQL 확장 기능이에요. SQL 표준에는 CREATE OPERATOR CLASS 문이 없습니다.
함께 보기 (See Also)
ALTER OPERATOR CLASS, DROP OPERATOR CLASS, CREATE OPERATOR FAMILY, ALTER OPERATOR FAMILY
더 알아보기 (Learn more)
CREATE OPERATOR FAMILY: 연산자 클래스들을 묶는 연산자 패밀리를 새로 정의하는 명령.ALTER OPERATOR CLASS: 기존 연산자 클래스를 수정하는 명령.