지금까지 설명한 절차를 통해 새로운 유형, 새로운 기능 및 새로운 연산자를 정의할 수 있습니다. 그러나 아직 새로운 데이터 유형의 열에 대한 인덱스를 정의할 수 없습니다. 이를 위해서는 다음을 정의해야 합니다.연산자 클래스새 데이터 유형용. 이 섹션의 뒷부분에서는 절대값 오름차순으로 복소수를 저장하고 정렬하는 B-트리 인덱스 방법에 대한 새로운 연산자 클래스라는 예를 통해 이 개념을 설명할 것입니다.
연산자 클래스는 다음과 같이 그룹화될 수 있습니다.운영자 가족의미적으로 호환되는 클래스 간의 관계를 표시합니다. 단일 데이터 유형만 관련된 경우 연산자 클래스로 충분하므로 먼저 해당 사례에 초점을 맞춘 다음 연산자 계열로 돌아갑니다.
그pg_am테이블에는 모든 인덱스 방법(내부적으로 액세스 방법이라고 함)에 대해 하나의 행이 포함되어 있습니다. 테이블에 대한 정기적인 액세스 지원이 내장되어 있습니다.PostgreSQL, 그러나 모든 색인 방법은 다음에 설명되어 있습니다.pg_am. 필요한 코드를 작성한 다음 항목을 생성하여 새로운 인덱스 액세스 방법을 추가할 수 있습니다.pg_am— 그러나 이는 이 장의 범위를 벗어납니다(참조토토 사이트 : 문서 : 11 : 61 장. 색인 액세스 방법 인터페이스 정의).
스포츠 토토 메소드의 루틴은 스포츠 토토 메소드가 작동할 데이터 유형에 대해 직접적으로 알지 못합니다. 대신에,연산자 클래스인덱스 메소드가 특정 데이터 유형을 사용하기 위해 사용해야 하는 작업 세트를 식별합니다. 연산자 클래스는 그들이 지정하는 한 가지가 다음의 집합이기 때문에 그렇게 불립니다.어디-인덱스와 함께 사용할 수 있는 절 연산자(즉, 인덱스 스캔 한정으로 변환 가능) 연산자 클래스는 일부를 지정할 수도 있습니다.지원 기능스포츠 토토 메소드의 내부 작업에 필요하지만 어떤 항목에도 직접적으로 대응되지는 않습니다.어디-색인과 함께 사용할 수 있는 절 연산자입니다.
동일한 데이터 유형 및 인덱스 방법에 대해 여러 연산자 클래스를 정의할 수 있습니다. 이렇게 하면 단일 데이터 유형에 대해 여러 인덱싱 의미 집합을 정의할 수 있습니다. 예를 들어, B-트리 인덱스에서는 작업하는 각 데이터 유형에 대해 정의된 정렬 순서가 필요합니다. 복소수 데이터 유형에는 데이터를 복소수 절대값으로 정렬하는 하나의 B-트리 연산자 클래스와 실수부로 정렬하는 또 다른 클래스를 갖는 것이 유용할 수 있습니다. 일반적으로 연산자 클래스 중 하나는 가장 일반적으로 유용한 것으로 간주되며 해당 데이터 유형 및 인덱스 메서드에 대한 기본 연산자 클래스로 표시됩니다.
동일한 연산자 클래스 이름은 여러 가지 다른 인덱스 방법에 사용될 수 있습니다(예를 들어 B-트리 및 해시 인덱스 방법에는 모두 이름이 지정된 연산자 클래스가 있습니다.int4_ops), 그러나 이러한 각 클래스는 독립적인 엔터티이므로 별도로 정의해야 합니다.
연산자 클래스와 연관된 연산자는 다음으로 식별됩니다.“전략 번호”, 연산자 클래스의 컨텍스트 내에서 각 연산자의 의미를 식별하는 데 사용됩니다. 예를 들어, B-트리는 키에 대해 작은 것부터 큰 것까지 엄격한 순서를 적용하므로 연산자는 다음과 같습니다.“미만”그리고“보다 크거나 같음”B-트리와 관련하여 흥미롭습니다. 왜냐면PostgreSQL사용자가 연산자를 정의할 수 있습니다.PostgreSQL연산자의 이름을 볼 수 없습니다(예:<또는=) 어떤 종류의 비교인지 알려주세요. 대신, 스포츠 토토 메소드는 일련의를 정의합니다.“전략”, 일반화된 연산자로 생각할 수 있습니다. 각 연산자 클래스는 특정 데이터 유형 및 인덱스 의미 해석에 대한 각 전략에 해당하는 실제 연산자를 지정합니다.
B-트리 인덱스 방법은 다음과 같이 5가지 전략을 정의합니다.표 38.2.
표 38.2. B-트리 전략
| 작동 | 전략 번호 | 
|---|---|
| 미만 | 1 | 
| 작거나 같음 | 2 | 
| 같음 | 3 | 
| 크거나 같음 | 4 | 
| 보다 큼 | 5 | 
해시 인덱스는 동등 비교만 지원하므로 다음과 같은 하나의 전략만 사용합니다.표 38.3.
표 38.3. 해시 전략
| 작전 | 전략 번호 | 
|---|---|
| 같음 | 1 | 
GiST 인덱스는 더 유연합니다. 고정된 전략 세트가 전혀 없습니다. 대신에“일관성”19537_19767“R-트리”에 표시된 전략표 38.4. 이 중 4개는 진정한 2차원 테스트입니다(겹침, 동일, 포함, 포함). 그 중 4개는 X 방향만 고려합니다. 나머지 4개는 Y 방향으로 동일한 테스트를 제공합니다.
표 38.4. GiST 2차원“R-트리”전략
| 작동 | 전략 번호 | 
|---|---|
| 완전히 왼쪽 | 1 | 
| 오른쪽으로 확장되지 않음 | 2 | 
| 겹침 | 3 | 
| 왼쪽으로 확장되지 않음 | 4 | 
| 완전히 오른쪽 | 5 | 
| 같은 | 6 | 
| 포함 | 7 | 
| 다음에 의해 포함됨 | 8 | 
| 위로 확장되지 않음 | 9 | 
| 엄격히 아래 | 10 | 
| 엄격히 위 | 11 | 
| 아래로 확장되지 않음 | 12 | 
SP-GiST 인덱스는 유연성 측면에서 GiST 인덱스와 유사합니다. 고정된 전략 세트가 없습니다. 대신 각 연산자 클래스의 지원 루틴은 연산자 클래스의 정의에 따라 전략 번호를 해석합니다. 예를 들어, 내장된 연산자 클래스에서 포인트에 사용되는 전략 번호는 다음과 같습니다.표 38.5.
표 38.5. SP-GiST 포인트 전략
| 작전 | 전략 번호 | 
|---|---|
| 완전히 왼쪽 | 1 | 
| 완전히 오른쪽 | 5 | 
| 동일 | 6 | 
| 다음에 의해 포함됨 | 8 | 
| 엄격히 아래 | 10 | 
| 엄격히 위 | 11 | 
GIN 인덱스는 고정된 전략 세트가 없다는 점에서 GiST 및 SP-GiST 인덱스와 유사합니다. 대신 각 연산자 클래스의 지원 루틴은 연산자 클래스의 정의에 따라 전략 번호를 해석합니다. 예를 들어 배열에 대한 내장 연산자 클래스에서 사용하는 전략 번호는 다음과 같습니다.표 38.6.
표 38.6. GIN 어레이 전략
| 작동 | 전략 번호 | 
|---|---|
| 겹침 | 1 | 
| 포함 | 2 | 
| 다음에 포함됨 | 3 | 
| 같음 | 4 | 
BRIN 인덱스는 고정된 전략 세트가 없다는 점에서 GiST, SP-GiST 및 GIN 인덱스와 유사합니다. 대신 각 연산자 클래스의 지원 루틴은 연산자 클래스의 정의에 따라 전략 번호를 해석합니다. 예를 들어, 내장된최소최대연산자 클래스는 다음에 표시됩니다.표 38.7.
표 38.7. BRIN 최소최대 전략
| 작전 | 전략 번호 | 
|---|---|
| 미만 | 1 | 
| 작거나 같음 | 2 | 
| 같음 | 3 | 
| 크거나 같음 | 4 | 
| 보다 큼 | 5 | 
위에 나열된 모든 연산자는 부울 값을 반환합니다. 실제로 스포츠 토토 메소드 검색 연산자로 정의된 모든 연산자는 유형을 반환해야 합니다.부울, 이는 a의 최상위 수준에 나타나야 하기 때문입니다.어디색인과 함께 사용되는 절입니다. (일부 인덱스 액세스 방법도 지원됩니다.순서 연산자, 일반적으로 부울 값을 반환하지 않습니다. 해당 기능은에서 논의됩니다.섹션 38.15.7.)
전략은 일반적으로 시스템이 색인 사용 방법을 파악하는 데 충분한 정보가 아닙니다. 실제로 인덱스 방법이 작동하려면 추가 지원 루틴이 필요합니다. 예를 들어, B-트리 인덱스 방법은 두 개의 키를 비교하고 하나가 다른 키보다 크거나 같거나 작은지 확인할 수 있어야 합니다. 마찬가지로 해시 인덱스 방법은 키 값에 대한 해시 코드를 계산할 수 있어야 합니다. 이러한 작업은 SQL 명령의 한정에 사용되는 연산자에 해당하지 않습니다. 내부적으로 인덱스 메소드에서 사용하는 관리 루틴입니다.
전략과 마찬가지로 연산자 클래스는 주어진 데이터 유형 및 의미 해석에 대해 어떤 특정 기능이 이러한 각 역할을 수행해야 하는지 식별합니다. 인덱스 메소드는 필요한 함수 세트를 정의하고 연산자 클래스는 해당 함수를 할당하여 사용할 올바른 함수를 식별합니다.“지원 기능 번호”스포츠 토토 방법으로 지정됩니다.
B-트리에는 비교 지원 기능이 필요하며 다음과 같이 연산자 클래스 작성자의 선택에 따라 두 개의 추가 지원 기능을 제공할 수 있습니다.표 38.8. 이러한 지원 기능에 대한 요구 사항은 다음 항목에 자세히 설명되어 있습니다.PostgreSQL : 문서 : 11 : 63.3. B- 트리 메이저 토토 사이트 기능.
표 38.8. B-트리 지원 함수
| 기능 | 지원 번호 | 
|---|---|
| 두 개의 키를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환하여 첫 번째 키가 두 번째 키보다 작거나 같거나 큰지 여부를 나타냅니다. | 1 | 
| C 호출 가능 정렬 지원 함수의 주소 반환(선택 사항) | 2 | 
| 테스트 값을 기본 값 +/- 오프셋과 비교하고 비교 결과에 따라 true 또는 false를 반환합니다(선택 사항) | 3 | 
해시 인덱스에는 하나의 지원 기능이 필요하며 다음과 같이 연산자 클래스 작성자의 선택에 따라 두 번째 지원 기능이 제공될 수 있습니다.표 38.9.
표 38.9. 해시 지원 함수
| 기능 | 지원 번호 | 
|---|---|
| 키에 대한 32비트 해시 값 계산 | 1 | 
| 64비트 솔트가 제공된 키에 대한 64비트 해시 값을 계산합니다. 솔트가 0인 경우 결과의 하위 32비트는 함수 1에 의해 계산된 값과 일치해야 합니다(선택 사항) | 2 | 
GiST 색인에는 9개의 지원 기능이 있으며 그 중 2개는 선택사항입니다.표 38.10. (자세한 내용은 다음을 참조하세요.젠 토토 : 문서 : 11 : 64 장.)
표 38.10. GiST 지원 기능
| 기능 | 설명 | 지원 번호 | 
|---|---|---|
일관됨 | 
              키가 쿼리 한정자를 만족하는지 확인 | 1 | 
연합 | 
              키 세트의 통합 계산 | 2 | 
압축 | 
              인덱싱할 키 또는 값의 압축된 표현을 계산 | 3 | 
압축해제 | 
              압축된 키의 압축 해제된 표현을 계산 | 4 | 
페널티 | 
              주어진 하위 트리의 키를 사용하여 하위 트리에 새 키를 삽입하는 경우 페널티를 계산합니다. | 5 | 
picksplit | 
              페이지의 어떤 항목이 새 페이지로 이동될지 결정하고 결과 페이지에 대한 통합 키를 계산 | 6 | 
같음 | 
              두 개의 키를 비교하고 같으면 true를 반환합니다. | 7 | 
거리 | 
              키에서 쿼리 값까지의 거리 결정(선택 사항) | 8 | 
가져오기 | 
              색인 전용 스캔을 위한 압축 키의 원래 표현 계산(선택 사항) | 9 | 
SP-GiST 인덱스에는 다음과 같이 5가지 지원 기능이 필요합니다.표 38.11. (자세한 내용은 다음을 참조하세요.PostgreSQL : 문서 : 11 : 65 장 윈 토토 색인.)
표 38.11. SP-GiST 지원 기능
| 기능 | 설명 | 지원 번호 | 
|---|---|---|
구성 | 
              연산자 클래스에 대한 기본 정보 제공 | 1 | 
선택 | 
              내부 튜플에 새 값을 삽입하는 방법 결정 | 2 | 
picksplit | 
              값 세트를 분할하는 방법 결정 | 3 | 
내부_일관성 | 
              쿼리를 위해 검색해야 하는 하위 파티션 결정 | 4 | 
leaf_condependent | 
              키가 쿼리 한정자를 만족하는지 확인 | 5 | 
GIN 색인에는 6개의 지원 기능이 있으며 그 중 3개는 선택사항입니다.표 38.12. (자세한 내용은 다음을 참조하세요.토토 사이트 순위 : 문서 : 11 : 66 장. 진 인덱스.)
표 38.12. GIN 지원 기능
| 기능 | 설명 | 지원 번호 | 
|---|---|---|
비교 | 
              두 개의 키를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환하여 첫 번째 키가 두 번째 키보다 작거나 같거나 큰지 여부를 나타냅니다. | 1 | 
추출값 | 
              인덱싱할 값에서 키 추출 | 2 | 
추출쿼리 | 
              쿼리 조건에서 키 추출 | 3 | 
일관됨 | 
              값이 쿼리 조건과 일치하는지 확인(부울 변형)(지원 함수 6이 있는 경우 선택 사항) | 4 | 
비교부분 | 
              쿼리의 부분 키와 인덱스의 키를 비교하고 0보다 작은 정수, 0 또는 0보다 큰 정수를 반환하여 GIN이 이 인덱스 항목을 무시해야 하는지, 해당 항목을 일치 항목으로 처리해야 하는지 또는 인덱스 스캔을 중지해야 하는지 나타냅니다(선택 사항) | 5 | 
트리일관성 | 
              값이 쿼리 조건과 일치하는지 확인(삼항 변형)(지원 함수 4가 있는 경우 선택 사항) | 6 | 
BRIN 지수에는 다음과 같이 4가지 기본 지원 기능이 있습니다.표 38.13; 이러한 기본 기능에는 추가 지원 기능을 제공해야 할 수도 있습니다. (자세한 내용은 다음을 참조하세요.토토 사이트 추천 PostgreSQL : 문서 : 11 : 67.3. 확장 성.)
표 38.13. BRIN 지원 기능
| 기능 | 설명 | 지원 번호 | 
|---|---|---|
opcInfo | 
              인덱싱된 열의 요약 데이터를 설명하는 내부 정보를 반환 | 1 | 
추가_값 | 
              기존 요약 색인 튜플에 새 값 추가 | 2 | 
일관됨 | 
              값이 쿼리 조건과 일치하는지 확인 | 3 | 
연합 | 
              두 요약 튜플의 합집합을 계산 | 4 | 
검색 연산자와 달리 지원 함수는 특정 색인 방법이 기대하는 데이터 유형을 반환합니다. 예를 들어 B-트리에 대한 비교 함수의 경우 부호 있는 정수입니다. 각 지원 함수에 대한 인수의 수와 유형은 마찬가지로 인덱스 방법에 따라 달라집니다. B-트리 및 해시의 경우 비교 및 해싱 지원 함수는 연산자 클래스에 포함된 연산자와 동일한 입력 데이터 유형을 사용하지만 대부분의 GiST, SP-GiST, GIN 및 BRIN 지원 함수에는 해당되지 않습니다.
이제 우리는 아이디어를 보았으므로 여기에 새로운 연산자 클래스를 생성하는 약속된 예가 있습니다. (이 예제의 작업 복사본은 다음에서 찾을 수 있습니다.src/tutorial/complex.c그리고src/tutorial/complex.sql소스 분포에서.) 연산자 클래스는 복소수를 절대값 순서로 정렬하는 연산자를 캡슐화하므로 이름을 선택합니다.complex_abs_ops. 먼저 일련의 연산자가 필요합니다. 연산자를 정의하는 절차는 다음에서 논의되었습니다.PostgreSQL : 문서 : 11 : 38.13. 사용자 정의 토토 꽁 머니. B-트리의 연산자 클래스에 필요한 연산자는 다음과 같습니다.
관련 비교 연산자 집합을 정의하는 오류가 발생하기 쉬운 방법은 B-트리 비교 지원 함수를 먼저 작성한 다음 지원 함수 주위에 한 줄 래퍼로 다른 함수를 작성하는 것입니다. 이렇게 하면 특수한 경우에 대해 일관되지 않은 결과를 얻을 가능성이 줄어듭니다. 이 접근 방식에 따라 먼저 다음을 작성합니다.
#define Mag(c) ((c)-x*(c)-x + (c)-y*(c)-y)
정적 정수
complex_abs_cmp_internal(복소수 *a, 복소수 *b)
    이중 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)
    복소수 *a = (복소수 *) PG_GETARG_POINTER(0);
    복소수 *b = (복소수 *) PG_GETARG_POINTER(1);
    PG_RETURN_BOOL(complex_abs_cmp_internal(a, b) < 0);
    다른 네 가지 함수는 내부 함수의 결과를 0과 비교하는 방법만 다릅니다.
다음으로 함수와 함수에 기반한 연산자를 SQL에 선언합니다.
CREATE FUNCTION complex_abs_lt(complex, complex) RETURNS bool
    그대로 '파일 이름', 'complex_abs_lt'
    언어 C 불변 STRICT;
연산자 만들기 < (
   leftarg = 복잡함, rightarg = 복잡함, 프로시저 = complex_abs_lt,
   정류자 =  , 부정자 = = ,
   제한 = scalarltsel, 조인 = scalarltjoinsel
);
    올바른 정류자 및 부정 연산자뿐만 아니라 적절한 제한 및 조인 선택 기능을 지정하는 것이 중요합니다. 그렇지 않으면 최적화 프로그램이 인덱스를 효과적으로 사용할 수 없습니다.
여기서 주목할만한 다른 일들이 일어나고 있습니다:
이름이 지정된 연산자는 하나만 있을 수 있습니다.=그리고 유형을 취함복잡한두 피연산자 모두에 대해. 이 경우에는 다른 연산자가 없습니다.=for복잡한, 하지만 실용적인 데이터 유형을 구축한다면 아마도 원할 것입니다.=복소수에 대한 일반적인 항등 연산입니다(절대값의 항등이 아님). 이 경우에는 다른 연산자 이름을 사용해야 합니다.complex_abs_eq.
하지만PostgreSQL인수 데이터 유형이 다른 한 동일한 SQL 이름을 가진 함수에 대처할 수 있지만 C는 주어진 이름을 가진 하나의 전역 함수에만 대처할 수 있습니다. 따라서 C 함수의 이름을 다음과 같이 간단하게 지정하면 안 됩니다.abs_eq. 일반적으로 다른 데이터 유형에 대한 함수와 충돌하지 않도록 C 함수 이름에 데이터 유형 이름을 포함하는 것이 좋습니다.
우리는 함수의 SQL 이름을 만들 수 있었습니다abs_eq, 의지함PostgreSQL인수 데이터 유형으로 동일한 이름의 다른 SQL 함수와 구별합니다. 예제를 단순하게 유지하기 위해 C 수준과 SQL 수준에서 함수의 이름을 동일하게 만듭니다.
다음 단계는 B-트리에 필요한 지원 루틴을 등록하는 것입니다. 이를 구현하는 예제 C 코드는 연산자 함수가 포함된 동일한 파일에 있습니다. 다음은 함수를 선언하는 방법입니다.
CREATE FUNCTION complex_abs_cmp(복합,복잡)
    정수를 반환합니다.
    그대로 '파일 이름'
    언어 C 불변 STRICT;
    이제 필요한 연산자와 지원 루틴이 있으므로 마침내 연산자 클래스를 만들 수 있습니다:
연산자 클래스 생성 complex_abs_ops
    btree AS를 사용하는 유형 콤플렉스의 기본값
        연산자 1 < ,
        연산자 2 <= ,
        연산자 3 = ,
        연산자 4 = ,
        연산자 5  ,
        기능 1 complex_abs_cmp(복잡함,복잡함);
    그리고 끝났습니다! 이제 B-트리 인덱스를 생성하고 사용할 수 있습니다.복잡한열.
우리는 다음과 같이 연산자 항목을 더 장황하게 작성할 수도 있었습니다:
연산자 1 < (복합, 복잡) ,
그러나 연산자가 우리가 연산자 클래스를 정의하는 것과 동일한 데이터 유형을 취하는 경우에는 그렇게 할 필요가 없습니다.
위의 예에서는 이 새로운 연산자 클래스를 다음에 대한 기본 B-트리 연산자 클래스로 만들고자 한다고 가정합니다.복잡한데이터 유형. 그렇지 않다면 그냥 단어를 생략하세요.기본값.
지금까지 우리는 연산자 클래스가 단 하나의 데이터 유형만을 다룬다고 암묵적으로 가정했습니다. 특정 인덱스 열에는 확실히 하나의 데이터 유형만 있을 수 있지만 인덱싱된 열을 다른 데이터 유형의 값과 비교하는 인덱스 작업에 유용한 경우가 많습니다. 또한 연산자 클래스와 관련하여 교차 데이터 유형 연산자를 사용하는 경우 다른 데이터 유형에 자체 관련 연산자 클래스가 있는 경우가 종종 있습니다. 관련 클래스 간의 연결을 명시적으로 만드는 것은 플래너가 SQL 쿼리를 최적화하는 데 도움이 될 수 있기 때문에 도움이 됩니다(특히 플래너가 작업 방법에 대한 많은 지식을 포함하고 있기 때문에 B-트리 연산자 클래스의 경우).
이러한 요구를 처리하려면,포스트그레SQLan의 개념을 사용합니다운영자 계열. 연산자 패밀리에는 하나 이상의 연산자 클래스가 포함되어 있으며, 인덱싱 가능한 연산자와 전체 패밀리에 속하지만 패밀리 내 단일 클래스에는 속하지 않는 해당 지원 함수도 포함될 수 있습니다. 우리는 그러한 연산자와 함수를 다음과 같이 말합니다.“느슨한”특정 클래스에 속박되는 것이 아니라 가족 내에서. 일반적으로 각 연산자 클래스에는 단일 데이터 유형 연산자가 포함되어 있는 반면 교차 데이터 유형 연산자는 계열에서 느슨합니다.
연산자 계열의 모든 연산자와 함수는 호환 가능한 의미 체계를 가져야 하며, 여기서 호환성 요구 사항은 인덱스 방법으로 설정됩니다. 그러므로 왜 계열의 특정 하위 집합을 연산자 클래스로 골라내려고 애쓰는지 궁금할 것입니다. 실제로 많은 목적을 위해 계급 구분은 중요하지 않으며 가족만이 유일하게 흥미로운 그룹입니다. 연산자 클래스를 정의하는 이유는 특정 인덱스를 지원하는 데 필요한 계열의 양을 지정하기 때문입니다. 연산자 클래스를 사용하는 인덱스가 있는 경우 해당 연산자 클래스는 인덱스를 삭제하지 않고 삭제할 수 없습니다. 그러나 연산자 계열의 다른 부분, 즉 다른 연산자 클래스 및 느슨한 연산자는 삭제될 수 있습니다. 따라서 특정 데이터 유형에 대한 인덱스 작업에 합리적으로 필요한 최소한의 연산자 및 함수 집합을 포함하도록 연산자 클래스를 지정해야 하며, 관련이 있지만 필수적이지 않은 연산자를 연산자 계열의 느슨한 멤버로 추가할 수 있습니다.
예를 들어,PostgreSQLB-트리 연산자 계열이 내장되어 있습니다integer_ops, 연산자 클래스 포함int8_ops, int4_ops및int2_ops다음 색인에 대해비긴트 (int8), 정수 (int4) 및작은int (int2) 열입니다. 또한 패밀리에는 이러한 유형 중 두 가지를 비교할 수 있는 교차 데이터 유형 비교 연산자가 포함되어 있으므로 이러한 유형 중 하나에 대한 인덱스를 다른 유형의 비교 값을 사용하여 검색할 수 있습니다. 가족은 다음 정의에 의해 복제될 수 있습니다.
btree를 사용하여 연산자 제품군 정수_ops 생성; 연산자 클래스 생성 int8_ops btree FAMILY 정수_ops AS를 사용하는 int8 유형의 기본값 -- 표준 int8 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint8cmp(int8, int8) , 기능 2 btint8sortsupport(내부) , 기능 3 in_range(int8, int8, int8, 부울, 부울) ; 연산자 클래스 생성 int4_ops btree FAMILY 정수_ops AS를 사용하는 int4 유형의 기본값 -- 표준 int4 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint4cmp(int4, int4) , 기능 2 btint4sortsupport(내부) , 기능 3 in_range(int4, int4, int4, 부울, 부울) ; 연산자 클래스 생성 int2_ops btree FAMILY 정수_ops AS를 사용하는 유형 int2의 기본값 -- 표준 int2 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint2cmp(int2, int2) , 기능 2 btint2sortsupport(내부) , 기능 3 in_range(int2, int2, int2, boolean, boolean) ; btree ADD를 사용하는 ALTER OPERATOR FAMILY 정수_ops -- int8과 int2의 유형 간 비교 연산자 1 < (int8, int2) , 연산자 2 <= (int8, int2) , 연산자 3 = (int8, int2) , 연산자 4 = (int8, int2) , 연산자 5 (int8, int2) , 기능 1 btint82cmp(int8, int2) , -- int8 대 int4 유형 간 비교 연산자 1 < (int8, int4) , 연산자 2 <= (int8, int4) , 연산자 3 = (int8, int4) , 연산자 4 = (int8, int4) , 연산자 5 (int8, int4) , 기능 1 btint84cmp(int8, int4) , -- int4 대 int2 유형 간 비교 연산자 1 < (int4, int2) , 연산자 2 <= (int4, int2) , 연산자 3 = (int4, int2) , 연산자 4 = (int4, int2) , 연산자 5 (int4, int2) , 기능 1 btint42cmp(int4, int2) , -- int4 대 int8 유형 간 비교 연산자 1 < (int4, int8) , 연산자 2 <= (int4, int8) , 연산자 3 = (int4, int8) , 연산자 4 = (int4, int8) , 연산자 5 (int4, int8) , 기능 1 btint48cmp(int4, int8) , -- int2와 int8의 유형 간 비교 연산자 1 < (int2, int8) , 연산자 2 <= (int2, int8) , 연산자 3 = (int2, int8) , 연산자 4 = (int2, int8) , 연산자 5 (int2, int8) , 기능 1 btint28cmp(int2, int8) , -- int2와 int4의 유형 간 비교 연산자 1 < (int2, int4) , 연산자 2 <= (int2, int4) , 연산자 3 = (int2, int4) , 연산자 4 = (int2, int4) , 연산자 5 (int2, int4) , 기능 1 btint24cmp(int2, int4) , -- 교차 유형 in_range 함수 기능 3 in_range(int4, int4, int8, boolean, boolean) , 기능 3 in_range(int4, int4, int2, boolean, boolean) , 기능 3 in_range(int2, int2, int8, boolean, boolean) , 함수 3 in_range(int2, int2, int4, 부울, 부울) ;
이 정의에 주목하세요“오버로드”운영자 전략 및 지원 기능 번호: 각 번호는 계열 내에서 여러 번 발생합니다. 이는 특정 숫자의 각 인스턴스가 고유한 입력 데이터 유형을 갖는 한 허용됩니다. 연산자 클래스의 입력 유형과 동일한 입력 유형을 모두 갖는 인스턴스는 해당 연산자 클래스에 대한 기본 연산자이자 지원 함수이며, 대부분의 경우 계열의 느슨한 멤버가 아닌 연산자 클래스의 일부로 선언되어야 합니다.
B-트리 연산자 계열에서 계열의 모든 연산자는 다음에 자세히 지정된 대로 호환 가능하게 정렬되어야 합니다.PostgreSQL : 문서 : 11 : 63.2. B- 트리 토토 사이트 순위 클래스의 행동. 계열의 각 연산자에는 연산자와 동일한 두 가지 입력 데이터 유형을 갖는 지원 함수가 있어야 합니다. 패밀리가 완전한 것이 좋습니다. 즉, 각 데이터 유형 조합에 대해 모든 연산자가 포함됩니다. 각 연산자 클래스에는 비교차 유형 연산자와 해당 데이터 유형에 대한 지원 함수만 포함되어야 합니다.
다중 데이터 유형 해시 연산자 계열을 구축하려면 계열이 지원하는 각 데이터 유형에 대해 호환 가능한 해시 지원 함수를 생성해야 합니다. 여기서 호환성이란 값의 유형이 다른 경우에도 계열의 항등 연산자에 의해 동일하다고 간주되는 두 값에 대해 함수가 동일한 해시 코드를 반환한다는 것을 의미합니다. 이는 일반적으로 유형의 물리적 표현이 다를 때 수행하기 어렵지만 어떤 경우에는 수행할 수 있습니다. 또한 암시적 또는 이진 강제 변환을 통해 연산자 계열에 표시된 한 데이터 유형의 값을 연산자 계열에 표시된 다른 데이터 유형으로 캐스팅하면 계산된 해시 값이 변경되어서는 안 됩니다. 지원 함수는 데이터 유형당 하나만 있고 항등 연산자당 지원 함수는 하나도 없습니다. 즉, 각 데이터 유형 조합에 대해 동등 연산자를 제공하는 등 완전한 패밀리를 제공하는 것이 좋습니다. 각 연산자 클래스에는 교차 유형이 아닌 동등 연산자와 해당 데이터 유형에 대한 지원 함수만 포함되어야 합니다.
GiST, SP-GiST 및 GIN 인덱스에는 교차 데이터 유형 작업에 대한 명시적인 개념이 없습니다. 지원되는 연산자 세트는 주어진 연산자 클래스에 대한 기본 지원 함수가 처리할 수 있는 모든 것입니다.
BRIN에서 요구사항은 연산자 클래스를 제공하는 프레임워크에 따라 다릅니다. 다음을 기반으로 하는 연산자 클래스의 경우최소최대, 필요한 동작은 B-트리 연산자 계열의 경우와 동일합니다. 계열의 모든 연산자는 호환 가능하게 정렬해야 하며 캐스트는 관련 정렬 순서를 변경해서는 안 됩니다.
이전PostgreSQL8.3에는 연산자 계열에 대한 개념이 없었으므로 인덱스와 함께 사용하려는 교차 데이터 유형 연산자는 인덱스의 연산자 클래스에 직접 바인딩되어야 했습니다. 이 접근 방식은 여전히 작동하지만 인덱스의 종속성을 너무 광범위하게 만들고 두 데이터 유형 모두 동일한 연산자 계열에 연산자가 있는 경우 플래너가 교차 데이터 유형 비교를 더 효과적으로 처리할 수 있기 때문에 더 이상 사용되지 않습니다.
PostgreSQL연산자 클래스를 사용하여 색인과 함께 사용할 수 있는지 여부보다 다양한 방법으로 연산자의 속성을 추론합니다. 따라서 데이터 유형의 열을 인덱싱할 의도가 없더라도 연산자 클래스를 생성하는 것이 좋습니다.
특히 다음과 같은 SQL 기능이 있습니다.주문 기준그리고독특값 비교 및 정렬이 필요합니다. 사용자 정의 데이터 유형에 이러한 기능을 구현하려면,포스트그레SQL데이터 유형에 대한 기본 B-트리 연산자 클래스를 찾습니다.“같음”이 연산자 클래스의 구성원은 값의 동일성에 대한 시스템의 개념을 정의합니다.그룹별그리고독특, 연산자 클래스에 의해 부과된 정렬 순서가 기본값을 정의합니다.주문 방법주문합니다.
데이터 유형에 대한 기본 B-트리 연산자 클래스가 없는 경우 시스템은 기본 해시 연산자 클래스를 찾습니다. 하지만 그런 종류의 연산자 클래스는 동등성만 제공하므로 정렬이 아닌 그룹화만 지원할 수 있습니다.
데이터 유형에 대한 기본 연산자 클래스가 없으면 다음과 같은 오류가 발생합니다.“순서 연산자를 식별할 수 없습니다.”이러한 SQL 기능을 데이터 유형과 함께 사용하려는 경우.
에포스트그레SQL7.4 이전 버전에서는 정렬 및 그룹화 작업이 암시적으로 다음과 같은 연산자를 사용했습니다.=, <및. 기본 연산자 클래스에 의존하는 새로운 동작은 특정 이름을 가진 연산자의 동작에 대해 어떤 가정도 하지 않아도 됩니다.
기본이 아닌 B-트리 연산자 클래스에 의한 정렬은 a에 클래스의 보다 작음 연산자를 지정하여 가능합니다.사용 중옵션, 예를 들어
SELECT * FROM mytable ORDER BY somecol USING ~<~;
또는 클래스의 보다 큼 연산자를 지정사용 중내림차순 정렬을 선택합니다.
사용자 정의 유형의 배열 비교는 유형의 기본 B-트리 연산자 클래스에 의해 정의된 의미에 의존합니다. 기본 B-트리 연산자 클래스는 없지만 기본 해시 연산자 클래스가 있는 경우 배열 동등성은 지원되지만 순서 비교는 지원되지 않습니다.
더 많은 데이터 유형별 지식이 필요한 또 다른 SQL 기능은 다음과 같습니다.범위 오프셋 이전/팔로우창 기능에 대한 프레이밍 옵션(참조섹션 4.2.8). 다음과 같은 쿼리의 경우
SELECT sum(x) OVER (앞 5개와 다음 10개 사이의 x 범위로 정렬) 내 테이블에서;
주문 방법을 아는 것만으로는 충분하지 않습니다.x; 데이터베이스는 또한 다음 방법을 이해해야 합니다.“5 빼기”또는“추가 10”현재 행의 값x현재 창 프레임의 경계를 식별합니다. 결과 경계를 다른 행의 값과 비교합니다.x는 다음을 정의하는 B-트리 연산자 클래스에서 제공하는 비교 연산자를 사용하여 가능합니다.주문 기준순서 — 그러나 더하기 및 빼기 연산자는 연산자 클래스의 일부가 아니므로 어떤 연산자를 사용해야 합니까? 다른 정렬 순서(다른 B-트리 연산자 클래스)에는 다른 동작이 필요할 수 있으므로 해당 선택을 하드 와이어링하는 것은 바람직하지 않습니다. 따라서 B-트리 연산자 클래스는 다음을 지정할 수 있습니다.범위 내정렬 순서에 적합한 더하기 및 빼기 동작을 캡슐화하는 지원 함수입니다. 오프셋으로 사용하기에 적합한 데이터 유형이 두 개 이상 있는 경우 두 개 이상의 in_range 지원 함수를 제공할 수도 있습니다.범위절. 창의와 연관된 B-트리 연산자 클래스인 경우주문 기준절에 일치하는 in_range 지원 함수가 없습니다.범위 오프셋 이전/다음옵션이 지원되지 않습니다.
또 다른 중요한 점은 해시 연산자 계열에 나타나는 항등 연산자가 해시 조인, 해시 집계 및 관련 최적화의 후보라는 것입니다. 해시 연산자 계열은 사용할 해시 함수를 식별하므로 여기서 필수적입니다.
일부 인덱스 액세스 방법(현재는 GiST만)은 다음 개념을 지원합니다.순서 연산자. 지금까지 우리가 논의한 내용은 다음과 같습니다.검색 연산자. 검색 연산자는 인덱스를 검색하여 만족하는 모든 행을 찾을 수 있는 연산자입니다.어디 indexed_column 연산자 상수. 일치하는 행이 반환되는 순서에 대해서는 아무 것도 약속되지 않습니다. 대조적으로, 순서 연산자는 반환될 수 있는 행 집합을 제한하지 않고 대신 순서를 결정합니다. 순서 연산자는 인덱스를 스캔하여 다음과 같은 순서로 행을 반환할 수 있는 연산자입니다.주문 기준 indexed_column 연산자 상수. 그런 식으로 순서 연산자를 정의하는 이유는 연산자가 거리를 측정하는 연산자인 경우 가장 가까운 이웃 검색을 지원하기 때문입니다. 예를 들어, 다음과 같은 쿼리는
SELECT * FROM 장소 ORDER BY 위치 <- 포인트 '(101,456)' LIMIT 10;
주어진 목표 지점에 가장 가까운 10개의 장소를 찾습니다. 위치 열의 GiST 스포츠 토토는 이 작업을 효율적으로 수행할 수 있습니다.<-순서 연산자입니다.
검색 연산자는 부울 결과를 반환해야 하지만, 순서 지정 연산자는 일반적으로 거리에 대한 부동 소수점 또는 숫자와 같은 다른 유형을 반환합니다. 이 유형은 일반적으로 인덱싱되는 데이터 유형과 동일하지 않습니다. 다양한 데이터 유형의 동작에 대한 고정된 가정을 피하려면 결과 데이터 유형의 정렬 순서를 지정하는 B-트리 연산자 계열의 이름을 지정하는 순서 연산자 정의가 필요합니다. 이전 섹션에서 설명한 대로 B-트리 연산자 패밀리는 다음을 정의합니다.포스트그레SQL의 순서 개념이므로 이는 자연스러운 표현입니다. 시점부터<-연산자가 반환됨float8, 다음과 같이 연산자 클래스 생성 명령에 지정할 수 있습니다.
연산자 15 <- (점, 점) FOR ORDER BY float_ops
어디에서float_ops은 다음 작업을 포함하는 내장 연산자 제품군입니다.float8. 이 선언은 스포츠 토토가 값이 증가하는 순서대로 행을 반환할 수 있음을 나타냅니다.<-연산자.
우리가 아직 논의하지 않은 연산자 클래스의 두 가지 특수 기능이 있는데, 주로 가장 일반적으로 사용되는 인덱스 방법에는 유용하지 않기 때문입니다.
일반적으로 연산자를 연산자 클래스(또는 계열)의 구성원으로 선언하는 것은 인덱스 메소드가 a를 만족하는 행 집합을 정확하게 검색할 수 있음을 의미합니다.어디에서연산자를 사용하는 조건. 예를 들면:
SELECT * FROM table WHERE 정수_열 < 4;
정수 열의 B-트리 인덱스로 정확하게 충족될 수 있습니다. 그러나 일치하는 행에 대한 부정확한 지침으로 인덱스가 유용한 경우가 있습니다. 예를 들어, GiST 인덱스가 기하학적 객체에 대한 경계 상자만 저장하는 경우 다음을 정확히 충족할 수 없습니다.어디다각형과 같은 직사각형이 아닌 객체 간의 겹침을 테스트하는 조건입니다. 그러나 경계 상자가 대상 개체의 경계 상자와 겹치는 개체를 찾기 위해 인덱스를 사용할 수 있으며, 그런 다음 인덱스에서 찾은 개체에 대해서만 정확한 중첩 테스트를 수행할 수 있습니다. 이 시나리오가 적용되면 인덱스는 다음과 같습니다.“손실”운영자용. 손실이 있는 인덱스 검색은 인덱스 메서드가 a를 반환하도록 하여 구현됩니다.다시 확인행이 실제로 쿼리 조건을 만족할 수도 있고 만족하지 않을 수도 있는 플래그입니다. 그런 다음 핵심 시스템은 검색된 행의 원래 쿼리 조건을 테스트하여 유효한 일치 항목으로 반환되어야 하는지 확인합니다. 이 접근 방식은 인덱스가 필요한 모든 행과 원래 연산자 호출을 수행하여 제거할 수 있는 일부 추가 행을 반환하도록 보장되는 경우에 작동합니다. 손실 검색을 지원하는 인덱스 메서드(현재 GiST, SP-GiST 및 GIN)를 사용하면 개별 연산자 클래스의 지원 기능이 재검사 플래그를 설정할 수 있으므로 이는 본질적으로 연산자 클래스 기능입니다.
다각형과 같은 복잡한 객체의 경계 상자만 색인에 저장하는 상황을 다시 생각해 보십시오. 이 경우 인덱스 항목에 전체 다각형을 저장하는 데 큰 가치가 없습니다. 유형의 더 간단한 객체만 저장하는 것이 좋습니다.상자. 이 상황은 다음과 같이 표현됩니다.저장옵션 포함오퍼레이터 클래스 생성: 다음과 같이 작성하겠습니다.
연산자 클래스 생성polygon_ops
    gist AS를 사용하는 유형 다각형의 기본값
        ...
        저장 상자;
    현재 GiST, GIN 및 BRIN 인덱스 방법만 다음을 지원합니다.저장열 데이터 유형과 다른 유형입니다. GiST압축그리고압축해제지원 루틴은 다음과 같은 경우 데이터 유형 변환을 처리해야 합니다.저장이 사용됩니다. GIN에서는저장type은 다음의 유형을 식별합니다.“키”값은 일반적으로 인덱싱된 열의 유형과 다릅니다. 예를 들어 정수 배열 열의 연산자 클래스에는 정수인 키가 있을 수 있습니다. 진추출값그리고추출쿼리지원 루틴은 색인화된 값에서 키를 추출하는 일을 담당합니다. BRIN은 GIN과 유사합니다.저장type은 저장된 요약 값의 유형을 식별하며 연산자 클래스의 지원 절차는 요약 값을 올바르게 해석하는 역할을 담당합니다.