이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 36.16. 와이즈 토토에 대한 확장 인터페이스버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

31.14. 인터페이스 토토 확장

지금까지 설명한 절차를 통해 새로운 유형을 정의 할 수 있습니다. 새로운 기능 및 새로운 운영자. 그러나 우리는 아직 정의 할 수 없습니다 새 데이터 유형의 열에있는 색인. 이렇게하려면 우리는해야합니다 정의운영자 클래스새 데이터 유형. 이 섹션의 뒷부분에서는이 개념을 설명합니다 예를 들어 : B-Tree Index Method의 새로운 운영자 클래스 오름차순으로 복소수를 저장하고 정렬합니다. 주문하다.

참고 :이전PostgreSQL릴리스 7.3, 필요했습니다 시스템 카탈로그에 수동 추가를하려면pg_amop, pg_amprocpg_opclass생성하기 위해 사용자 정의 연산자 클래스. 그 접근법은 이제 더 이상 사용되지 않습니다 사용에 찬성하여운영자 생성 수업, 훨씬 간단하고 오류가 덜 발생합니다. 필요한 카탈로그 항목 생성.

31.14.1. 색인 방법 및 운영자 클래스

thePG_AM테이블에는 하나가 포함되어 있습니다 모든 인덱스 방법에 대한 행 (내부적으로 액세스 방법으로 알려져 있음). 테이블에 대한 정기적 인 액세스 지원PostgreSQL이지만 모든 토토 방법이 있습니다 설명PG_AM. 그것은 필요한 것을 정의하여 새 인덱스 방법을 추가 할 수 있습니다. 인터페이스 루틴을 한 다음에서 행 생성PG_AM- 그러나 그것은 범위를 훨씬 뛰어 넘습니다 이 장.

토토 방법의 루틴은 직접 알지 못합니다. 토토 방법이 작동합니다. 대신, an운영자 수업인덱스 방법이 작동하는 데 사용하는 일련 특정 데이터 유형으로. 운영자 클래스는 소위 호출됩니다 그들이 지정한 한 가지는이기 때문입니다.여기서-an과 함께 사용할 수있는 사고 연산자 인덱스 (즉, 인덱스 스캔으로 변환 될 수 있습니다 자격). 운영자 클래스도 일부를 지정할 수도 있습니다지원 절차토토 방법의 내부 작업이지만 직접적으로 해당여기서-Clause 연산자와 함께 사용할 수 있습니다 색인.

동일한 데이터 유형 및 인덱스 방법. 이렇게하면 여러 세트가 있습니다 단일 데이터 유형에 대해 인덱싱 의미를 정의 할 수 있습니다. 예를 들어, B-Tree 지수는 정렬 순서가 필요합니다. 작동하는 각 데이터 유형에 대해 정의됩니다. 유용 할 수 있습니다 하나의 B- 트리 운영자 클래스를 갖기위한 복잡한 수 데이터 유형 데이터를 복잡한 절대 값으로 정렬합니다. 실제 부분에 따라 정렬됩니다. 일반적으로 연산자 중 하나입니다 수업은 가장 일반적으로 유용한 것으로 간주되며 표시됩니다. 해당 데이터 유형 및 인덱스의 기본 연산자 클래스로 방법.

동일한 연산자 클래스 이름을 여러 곳에서 사용할 수 있습니다. 다른 인덱스 방법 (예 : B- 트리 및 해시 모두 인덱스 방법에는이라는 운영자 클래스가 있습니다.int4_ops), 그러나 그러한 클래스는 독립적입니다 엔티티 및 별도로 정의되어야합니다.

31.14.2. 색인 메소드 전략

운영자 클래스와 관련된 연산자는입니다 식별"전략 번호", 각 연산자의 의미를 식별하는 역할을합니다. 운영자 클래스의 맥락. 예를 들어, B- 트리가 부과됩니다 키에 대한 엄격한 주문, 더 큰 것보다 더 큰 것, 그래서 운영자 좋다""보다 작습니다.and""보다 크거나 동일합니다.흥미 롭습니다 B- 트리에 대한 존중. 왜냐하면postgresql사용자가 정의 할 수 있습니다 운영자,PostgreSQL할 수 없습니다 연산자의 이름을보십시오 (예 :<또는 =) 그리고 말하면 어떤 종류의 비교. 대신 토토 방법 세트를 정의합니다."전략"일반화 된 운영자로 생각할 수 있습니다. 각 운영자 클래스 실제 운영자가 각 전략에 해당하는 것을 지정합니다 특정 데이터 유형 및 인덱스 해석의 경우 의미론.

B- 트리 색인 메소드는 5 가지 전략을 정의합니다.테이블 31-2.

표 31-2. B- 트리 전략

작동 전략 번호
1
작거나 평등 한 2
Equal 3
더 크거나 평등 4
보다 큰 5

해시 토토는 비트 동등성 만 표현하므로 사용합니다. 하나의 전략 만 표시표 31-3.

표 31-3. 해시 전략

작동 전략 번호
Equal 1

R- 트리 토토는 사각형 함유 관계를 표현합니다. 그들은 8 가지 전략을 사용합니다.표 31-4.

표 31-4. R- 트리 전략

작동 전략 번호
왼쪽 1
왼쪽 또는 중첩 2
중첩 3
오른쪽 또는 중첩 4
오른쪽 5
동일 6
포함 7
포함 8

GIST 토토는 훨씬 더 유연합니다. 고정 된 전략 세트. 대신,"일관성"각 특정의 지원 루틴 그러나 GIST 운영자 클래스는 전략 번호를 해석하지만이를 해석합니다 좋아요.

모든 전략 운영자는 부울 값을 반환합니다. ~ 안에 실습, 토토 방법 전략으로 정의 된 모든 운영자는해야합니다 반환 유형부울A의 최상위 레벨에 나타납니다.여기서토토와 함께 사용할 조항

그건 그렇고,Amorderstrategy열에서 열PG_AM인덱스 메소드는 순서 스캔을 지원합니다. 0은 그렇지 않다는 것을 의미합니다. 그렇다면Amorderstrategyis 주문 연산자에 해당하는 전략 번호. 을 위한 예를 들어, B-Tree는Amorderstrategy= 1,""보다 작습니다.전략 번호.

31.14.3. 색인 방법 지원 루틴

전략은 일반적으로 시스템에 대한 정보가 충분하지 않습니다 인덱스 사용 방법을 알아 내기 위해. 실제로, 색인 방법은 작업하려면 추가 지원 루틴이 필요합니다. 예를 들어 B-Tree 지수 방법은 비교할 수 있어야합니다. 두 개의 열쇠가 하나 이상의 키를 결정합니다. 또는 다른 것보다 적습니다. 마찬가지로, R- 트리 인덱스 방법도 있어야한다 교차로, 노조 및 크기를 계산할 수 있습니다 사각형. 이러한 작업은 운영자에 해당하지 않습니다 SQL 명령의 자격에 사용; 그들은 행정입니다 내부적으로 인덱스 방법에 사용되는 루틴.

전략과 마찬가지로 운영자 클래스는 어떤 식별합니다 특정 기능은 주어진에 대해 이러한 각 역할을 수행해야합니다. 데이터 유형 및 시맨틱 해석. 인덱스 메소드가 정의됩니다 필요한 기능 세트 및 운영자 클래스 할당하여 사용할 올바른 기능을 식별합니다. 그만큼"지원 기능 번호".

B- 트리는 단일 지원 함수가 필요합니다.표 31-5.

표 31-5. B- 트리 지원 기능

기능 지원 번호
두 개의 키를 비교하고 정수를보다 적게 반환하십시오 0, 0보다 큰 0보다 큽니다 첫 번째 키는 두 번째. 1

해시 인덱스 마찬가지로 하나의 지원 함수가 필요합니다.테이블 31-6.

표 31-6. 해시 지원 기능

기능 지원 번호
키의 해시 값 계산 1

R- 트리 인덱스에는 3 개의 지원 함수가 필요합니다.테이블 31-7.

표 31-7. R- 트리 지원 기능

기능 지원 번호
Union 1
교차로 2
size 3

GIST 인덱스에는 7 개의 지원 기능이 필요합니다.테이블 31-8.

표 31-8. GIST 지원 기능

기능 지원 번호
일관성 1
Union 2
압축 3
Decompress 4
페널티 5
picksplit 6
Equal 7

전략 운영자와 달리 지원 기능 반환 특정 인덱스 메소드가 기대하는 데이터를 유형하든 B- 트리의 비교 함수의 경우 예, A 서명 정수.

31.14.4. 예

이제 우리는 아이디어를 보았으니 여기에 약속 된 것들이 있습니다. 새로운 운영자 클래스 생성의 예. (당신은 찾을 수 있습니다 이 예제의 작업 사본SRC/Tutorial/Complex.candsrc/튜토리얼/complex.sql소스에서 배포.) 운영자 클래스는 연산자를 캡슐화합니다 절대 값 순서로 복소 번호를 정렬하므로 이름complex_abs_ops. 먼저, 우리는 필요합니다 운영자 세트. 운영자를 정의하는 절차 논의사설 토토 : 문서 : 8.0 : 사용자 정의 연산자. For an B- 트리의 운영자 클래스, 우리가 필요로하는 운영자는 다음과 같습니다.

  • 절대 값이 적은 것보다 (전략 1)
  • 절대 값은 평등하지 않은 것 (전략 2)
  • 절대 값 동일 (전략 3)
  • 절대 값은 동등한 것보다 더 큰 값 (전략 4)
  • 절대-값보다 더 큰 (전략 5)

관련 세트를 정의하는 최소 오류가 발생하기 쉬운 방법 비교 연산자는 B- 트리 비교 지원을 작성하는 것입니다 먼저 기능을 한 다음 다른 기능을 일선으로 씁니다. 지원 기능 주위에 포장기. 이것은 가능성을 줄입니다 코너 케이스에 대한 일관되지 않은 결과를 얻습니다. 이후 접근, 우리는 먼저 쓰기

#define mag (c) ((c)- x*(c)- x + (c)- y*(c)- y)

정적 int
complex_abs_cmp_internal (complex *a, complex *b)

    Double Amag = mag (a),
                bmag = mag (b);

    if (amag <bmag)
        반품 -1;
    if (amag bmag)
        반환 1;
    반환 0;

이제 기능보다 적은 기능은

pg_function_info_v1 (complex_abs_lt);

자료
complex_abs_lt (pg_function_args)

    complex *a = (복잡한 *) pg_getarg_pointer (0);
    복합체 *b = (복합체 *) pg_getarg_pointer (1);

    pg_return_bool (complex_abs_cmp_internal (a, b) <0);

다른 네 가지 기능은 그들이 비교하는 방식에만 다릅니다. 내부 기능의 결과는 0입니다.

다음에 우리는 기능과 연산자를 SQL에 대한 함수 :

기능 작성 complex_abs_lt (복잡한, 복잡한) bool을 반환합니다
    처럼 'filename','complex_abs_lt '
    언어 C 불변의 엄격;

연산자 생성 <(
   leftarg = complex, rightarg = complex, process = complex_abs_lt,
   Commutator =, Negator = =,
   scalarltsel giant = scalarltjoinsel join = scalarltsel
);

올바른 통근자를 지정하는 것이 중요합니다 적절한 제한 및 가입뿐만 아니라 부정 연산자 선택성 함수, 그렇지 않으면 Optimizer가 불가능합니다 인덱스를 효과적으로 사용합니다. 적은 것보다 동일하고 더 큰 경우는 다른 선택성을 사용해야합니다 기능.

주목할만한 다른 일이 여기에서 일어나고 있습니다 :

  • 하나의 연산자 만있을 수 있습니다.=및 유형복잡한두 피연산자 모두. 이 경우 우리는 다른 운영자가 없습니다=for복잡한, 그러나 우리가 건축중인 경우 우리가 원하는 실용적인 데이터 유형=일반 평등 작전이되기 위해 복소수 (절대의 평등이 아닙니다 값). 이 경우 다른 운영자를 사용해야합니다. 이름complex_abs_eq.

  • 비록PostgreSQLcan 동일한 이름을 가진 기능에 대처 다른 인수 데이터 유형이 있습니다. C는 주어진 이름을 가진 하나의 글로벌 기능. 그래서 우리는해서는 안됩니다 C 기능을 단순한 것과 같은 이름으로 지정하십시오abs_eq. 일반적으로 좋은 관행입니다 C 함수 이름에 데이터 유형 이름을 포함 시키십시오. 다른 데이터 유형의 기능과 충돌하지 않기 위해.

  • 우리는를 만들 수있었습니다PostgreSQL함수 이름abs_eq, 의존PostgreSQL그것을 구별합니다 다른 사람의 인수 데이터 유형PostgreSQL같은 이름의 함수. 예제를 단순하게 유지하기 위해 기능에 C 레벨에서 동일하고PostgreSQL레벨.

다음 단계는 지원 루틴 등록입니다. B- 트리에 필요합니다. 이것을 구현하는 예제 C 코드 연산자 함수가 포함 된 동일한 파일에서. 이것은 기능을 선언하는 방법 :

함수 만들기 complex_abs_cmp (complex, complex)
    정수를 반환합니다
    처럼 'filename'
    언어 c 불변의 엄격한;

이제 필요한 연산자와 지원 루틴이 있으므로 우리는 마침내 운영자 클래스를 만들 수 있습니다 :

운영자 클래스 complex_abs_ops를 만듭니다
    btree as를 사용하여 유형 복합체의 기본값
        연산자 1 <,
        연산자 2 <=,
        연산자 3 =,
        연산자 4 =,
        연산자 5,
        함수 1 Complex_ABS_CMP (Complex, Complex);

그리고 우리는 끝났습니다! 이제 만들고 사용할 수 있어야합니다 B- 트리 색인복잡한

우리는 운영자 항목을 더 구두로 쓸 수있었습니다. 에서와 같이

연산자 1 <(복잡한, 복잡한),

그러나 운영자가 동일한 데이터 유형 우리는 운영자 클래스를 정의하는 것과 동일합니다.

위의 예는 이것을 새로 만들고 싶다고 가정합니다. 운영자 클래스의 기본 B- 트리 연산자 클래스복잡한데이터 유형. 그렇지 않다면, 그냥 단어를 남겨주세요기본값.

31.14.5. 교차 데이터 유형 연산자 클래스

지금까지 우리는 운영자 클래스가 암시 적으로 가정했습니다. 하나의 데이터 유형 만 처리합니다. 확실히있을 수 있습니다 특정 인덱스 열에서 하나의 데이터 유형 만 인덱스 된 열을 다른 데이터 유형의 값. 이것은 현재 지원됩니다 B- 트리 및 GIST 인덱스 방법.

B- 트리는 각 연산자의 왼쪽 피연산자가 인덱스 된 데이터 유형이지만 오른쪽 피연산자는 다른 유형. 지원 함수가 있어야합니다 일치하는 서명. 예를 들어, 내장 운영자 클래스 유형bigint(int8)) 교차 유형 비교와int4andint2. 그럴 수 있습니다 이 정의에 의해 복제된다 :

운영자 클래스 생성 int8_ops
btree as를 사용하여 int8 유형의 기본값
  - 표준 INT8 비교
  연산자 1 <,
  연산자 2 <=,
  연산자 3 =,
  연산자 4 =,
  연산자 5,
  함수 1 btint8cmp (int8, int8),

  -int2와의 교차 유형 비교 (smallint)
  연산자 1 <(int8, int2),
  연산자 2 <= (int8, int2),
  연산자 3 = (int8, int2),
  연산자 4 = (int8, int2),
  연산자 5 (int8, int2),
  함수 1 btint82cmp (int8, int2),

  -INT4 (Integer)와의 교차 유형 비교
  연산자 1 <(int8, int4),
  연산자 2 <= (int8, int4),
  연산자 3 = (int8, int4),
  연산자 4 = (int8, int4),
  연산자 5 (int8, int4),
  함수 1 btint84cmp (int8, int4);

이 정의를 알아라"오버로드"운영자 전략 및 지원 기능 번호. 이것은 허용됩니다 (B-tree 운영자 클래스의 경우 특정 숫자의 각 인스턴스에 오른쪽 데이터 유형이 다릅니다. 그렇지 않은 인스턴스 크로스 타입은 운영자의 기본 또는 기본 연산자입니다. 수업.

GIST 인덱스는 전략 또는 지원의 과부하를 허용하지 않습니다. 함수 번호이지만 여전히 효과를 얻을 수 있습니다. 할당하여 여러 오른쪽 데이터 유형을 지원합니다 필요한 각 운영자에게 뚜렷한 전략 번호 지원. 그만큼일관성지원 기능은 전략 번호, 비교를 수락 할 준비가되어 있어야합니다 적절한 데이터 유형의 값.

31.14.6. 시스템 의존성 운영자 클래스

PostgreSQL운영자를 사용합니다 더 많은 방법으로 운영자의 속성을 추론하는 클래스 인덱스와 함께 사용할 수 있는지 여부. 그러므로 당신은 없더라도 운영자 클래스를 만들고 싶을 수도 있습니다. 데이터 유형의 모든 열을 인덱싱하려는 의도

특히와 같은 SQL 기능이 있습니다.주문 byand별도의값의 비교 및 정렬이 필요합니다. 구현하려면 사용자 정의 데이터 유형의 이러한 기능PostgreSQL기본 B- 트리를 찾습니다 데이터 유형의 연산자 클래스. 그만큼"Equals"이 운영자 클래스의 구성원은 정의합니다 시스템의 가치 평등 개념에 대한그룹 by별도의, 그리고 운영자 클래스가 부과하는 정렬 순서는 다음을 정의합니다. 기본주문 by주문.

사용자 정의 유형의 배열 비교도 의존합니다 기본 B-Tree 연산자 클래스에 의해 정의 된 의미론.

데이터에 대한 기본 B-Tree 연산자 클래스가없는 경우 유형, 시스템은 기본 해시 운영자 클래스를 찾습니다. 그러나 이러한 종류의 운영자 클래스는 평등만을 제공하기 때문에 실제로는 배열 평등을 지원하기에 충분합니다.

데이터 유형에 대한 기본 연산자 클래스가 없으면 귀하 와 같은 오류가 발생합니다."를 식별 할 수 없습니다 오퍼레이터 주문 "이 SQL 기능을 사용하려는 경우 데이터 유형으로.

참고 :inPostgreSQL7.4 이전 버전, 정렬 및 그룹화 작업은 암시 적으로 사용됩니다 운영자 이름=, <. 그만큼 기본 연산자 클래스에 의존하는 새로운 동작은 피합니다 행동에 대해 어떤 가정을해야합니다 특정 이름을 가진 운영자.

31.14.7. 운영자의 특수 기능 클래스

운영자 클래스에는 두 가지 특별한 기능이 있습니다. 아직 유용하지 않기 때문에 아직 논의하지 않았습니다. 가장 일반적으로 사용되는 색인 방법.

일반적으로 운영자의 구성원으로 연산자 선언 클래스는 토토 메소드가 세트를 정확히 검색 할 수 있음을 의미합니다. A를 만족시키는 행어디조건 연산자 사용. 예를 들어,

선택 *에서 integer_column <4; 테이블에서

정수의 B- 트리 지수에 의해 정확하게 만족할 수 있습니다. 열. 그러나 색인이 유용한 경우가 있습니다. 일치하는 행에 대한 부당한 안내서. 예를 들어, R- 트리 인 경우 토토는 객체에 대한 경계 상자 만 저장하면 정확히 만족어디조건 테스트는 다각형과 같은 비정형 물체간에 겹칩니다. 그러나 우리는 인덱스를 사용하여 경계 상자를 가진 객체를 찾을 수 있습니다. 대상 객체의 경계 상자를 겹친 다음 인덱스가 발견 한 객체에서만 정확한 오버랩 테스트. 만약에 이 시나리오는 적용되며 색인은라고합니다."Lossy"운영자의 경우Recheckto the운영자절의 조항운영자 클래스 만들기명령.다시 확인인덱스 인 경우 유효합니다 필요한 모든 행을 반환하고 아마도 일부 추가 행. 원래 운영자 호출.

우리가 보관하는 상황을 다시 고려하십시오. 와 같은 복잡한 객체의 경계 상자 만 색인 다각형. 이 경우 저장에는 가치가 많지 않습니다. 인덱스 항목의 전체 다각형 - 우리는 유형의 간단한 대상Box. 이것 상황은에 의해 표현됩니다.스토리지옵션운영자 클래스 만들기: 우리는 와 같은 글을 쓰십시오.

운영자 클래스 Polygon_ops 작성
    GIST AS를 사용하여 유형 다각형의 기본값
        ...
        스토리지 박스;

현재, Gist Index 메소드 만 지원합니다.스토리지열과 다른 유형 데이터 유형. The GistcompressandDecompress지원 루틴이 처리되어야합니다 데이터 유형 변환이있을 때스토리지사용됩니다.