Postgresql 9.2.24 문서 | ||||
---|---|---|---|---|
이전 | up | 35 장. 확장SQL | 다음 |
지금까지 설명한 절차를 통해 새로운 유형을 정의 할 수 있습니다. 새로운 기능 및 새로운 운영자. 그러나 우리는 아직 정의 할 수 없습니다 새 데이터 유형의 열에있는 색인. 이렇게하려면 우리는해야합니다 정의운영자 클래스새 데이터 유형. 이 섹션의 뒷부분에서는이 개념을 설명합니다 예를 들어 : B-Tree Index Method의 새로운 운영자 클래스 오름차순으로 복소수를 저장하고 정렬합니다. 주문하다.
운영자 클래스를 그룹으로 그룹화 할 수 있습니다운영자 가족관계를 보여주기 위해 의미 적으로 호환 가능한 클래스 사이. 단일 데이터 만있을 때 유형이 관련되어 있고 운영자 클래스가 충분하므로 집중하겠습니다. 이 경우 먼저 운영자 패밀리로 돌아갑니다.
thePG_AM
테이블에는 하나가 포함되어 있습니다
모든 인덱스 방법에 대한 행 (내부적으로 액세스 방법으로 알려져 있음).
테이블에 대한 정기적 인 액세스 지원PostgreSQL이지만 모든 토토 커뮤니티 방법이 있습니다
설명PG_AM
. 그것은
필요한 것을 정의하여 새 인덱스 방법을 추가 할 수 있습니다.
인터페이스 루틴을 한 다음에서 행 생성PG_AM
- 그러나 이것은 이것의 범위를 벗어납니다
챕터 ( 참조PostgreSQL : 문서 : 9.2 : 토토 사이트 액세스 방법 인터페이스 정의).
토토 커뮤니티 방법의 루틴은 직접 알지 못합니다. 토토 커뮤니티 방법이 작동합니다. 대신, an운영자 클래스인덱스 메소드가 필요한 작업 세트를 식별합니다. 특정 데이터 유형으로 작업하는 데 사용됩니다. 운영자 클래스입니다 그들이 지정한 한 가지는이기 때문에 소위여기서-클레이즈 작업자 인덱스와 함께 사용 (즉, 인덱스 스캔으로 변환 할 수 있습니다. 자격). 운영자 클래스도 일부를 지정할 수 있습니다지원 절차토토 커뮤니티 방법의 내부 작업이지만 직접적으로 해당여기서-Clase 연산자와 함께 사용할 수 있습니다 색인.
동일한 데이터 유형 및 인덱스 방법. 이렇게하면 여러 세트가 있습니다 단일 데이터 유형에 대해 인덱싱 의미를 정의 할 수 있습니다. 예를 들어, B-Tree 지수는 정렬 순서가 필요합니다. 작동하는 각 데이터 유형에 대해 정의됩니다. 유용 할 수 있습니다 하나의 B- 트리 운영자 클래스를 갖기위한 복잡한 수 데이터 유형 데이터를 복잡한 절대 값으로 정렬합니다. 실제 부분에 따라 정렬됩니다. 일반적으로 연산자 중 하나입니다 수업은 가장 일반적으로 유용한 것으로 간주되며 표시됩니다. 해당 데이터 유형 및 인덱스의 기본 연산자 클래스로 방법.
동일한 연산자 클래스 이름을 여러 곳에서 사용할 수 있습니다. 다른 인덱스 방법 (예 : B- 트리 및 해시 모두 인덱스 방법에는이라는 운영자 클래스가 있습니다.int4_ops), 그러나 그러한 클래스는 독립적입니다 엔티티 및 별도로 정의되어야합니다.
운영자 클래스와 관련된 연산자는 다음과 같습니다 식별"전략 번호", 각 연산자의 의미를 식별하는 역할을합니다. 운영자 클래스의 맥락. 예를 들어, B- 트리가 부과됩니다 키에 대한 엄격한 주문, 더 큰 것보다 더 큰 것, 그래서 운영자 좋다""보다 작습니다.and""보다 크거나 동일합니다.흥미 롭습니다 B- 트리에 대한 존중. 왜냐하면PostgreSQL사용자가 정의 할 수 있습니다 운영자,postgresql할 수 없습니다 연산자의 이름을보십시오 (예 :<또는 =) 그리고 말하고 말하십시오 어떤 종류의 비교. 대신 토토 커뮤니티 방법 세트를 정의합니다."전략"일반화 된 운영자로 생각할 수 있습니다. 각 운영자 클래스 실제 운영자가 각 전략에 해당하는 것을 지정합니다 특정 데이터 유형 및 인덱스 해석의 경우 의미론.
B- 트리 색인 메소드는 5 가지 전략을 정의합니다.테이블 35-2.
해시 인덱스는 평등 비교 만 지원합니다 에 표시된 하나의 전략 만 사용하십시오표 35-3.
GIST 토토 커뮤니티는 더 유연합니다. 고정 세트가 없습니다. 전략의 전략. 대신,"일관성"각 특정의 지원 루틴 그러나 GIST 운영자 클래스는 전략 번호를 해석하지만이를 해석합니다 좋아합니다. 예를 들어, 몇 가지 내장 GIST 인덱스 연산자 클래스 인덱스 2 차원 기하학적 물체, 제공"r-tree"전략 표시테이블 35-4. 이 중 4 개는 진정한 2 차원 테스트입니다 (겹침, 동일, 포함, 포함); 그들 중 4 명은 고려합니다 x 방향 만; 다른 4 개는 동일한 테스트를 제공합니다 y 방향으로.
표 35-4. GIST 2 차원"r-tree"전략
작동 | 전략 번호 |
---|---|
엄격하게 왼쪽 | 1 |
오른쪽으로 확장되지 않습니다 | 2 |
겹침 | 3 |
왼쪽으로 확장되지 않습니다 | 4 |
엄격하게 | 5 |
동일 | 6 |
포함 | 7 |
포함 | 8 |
위에 확장되지 않습니다 | 9 |
엄격하게 아래 | 10 |
엄격하게 위 | 11 |
아래에 확장되지 않습니다 | 12 |
SP-Gist 인덱스는 유연성의 GIST 인덱스와 유사합니다. 그들은 고정 된 전략 세트가 없습니다. 대신 지원 각 운영자 클래스의 루틴은 전략 번호를 해석합니다 운영자 클래스의 정의에 따르면. 예를 들어, 내장 운영자 클래스에서 사용하는 전략 번호 포인트가에 표시됩니다.테이블 35-5.
진 인덱스는 GIST 및 SP-GIST 인덱스와 유사합니다. 그들은 고정 된 전략 세트도 없습니다. 대신 각 운영자 클래스의 지원 루틴은 전략을 해석합니다 운영자 클래스의 정의에 따른 숫자. 로서 예를 들어, 내장 운영자가 사용하는 전략 번호 배열에 대한 클래스는에 표시됩니다.표 35-6.
위에 나열된 모든 운영자가 부울 반환을 주목하십시오 값. 실제로 모든 연산자는 토토 커뮤니티 방법으로 정의되었습니다 검색 연산자가 유형을 반환해야합니다부울에이여기서색인. (일부 인덱스 액세스 방법도 지원주문 연산자, 일반적으로 그렇지 않습니다 반환 부울 값; 그 기능은에서 논의됩니다.섹션 35.14.7.)
전략은 일반적으로 시스템에 대한 정보가 충분하지 않습니다 인덱스 사용 방법을 알아 내기 위해. 실제로, 색인 방법은 작업하려면 추가 지원 루틴이 필요합니다. 예를 들어 B-Tree 지수 방법은 비교할 수 있어야합니다. 두 개의 열쇠가 하나 이상의 키를 결정합니다. 또는 다른 것보다 적습니다. 마찬가지로 해시 인덱스 방법도 있어야합니다 키 값에 대한 해시 코드를 계산할 수 있습니다. 이 작업 SQL 자격에 사용되는 운영자에 해당하지 마십시오. 명령; 그들은 지수가 사용하는 관리 루틴입니다 내부적으로 방법.
전략과 마찬가지로 운영자 클래스는 어떤 식별합니다 특정 기능은 주어진에 대해 이러한 각 역할을 수행해야합니다. 데이터 유형 및 시맨틱 해석. 인덱스 메소드가 정의됩니다 필요한 기능 세트 및 운영자 클래스 할당하여 사용할 올바른 기능을 식별합니다. 그만큼"지원 기능 번호"토토 커뮤니티 메소드에 의해 지정됩니다.
B- 트리는 단일 지원 함수가 필요하며 a 운영자 클래스 저자의 두 번째로 제공됩니다. 옵션,표 35-7.
표 35-7. B- 트리 지원 기능
기능 | 지원 번호 |
---|---|
두 개의 키를 비교하고 정수를보다 적게 반환하십시오 0, 0보다 큰 0보다 큽니다 첫 번째 키는 두 번째 | 1 |
C-Callable 정렬 지원의 주소를 반환합니다 기능에 문서화 된 기능utils/sortsupport.h(선택 사항) | 2 |
해시 인덱스는 하나의 지원 함수가 필요합니다.표 35-8.
GIST 인덱스에는 7 가지 지원 기능이 필요합니다 옵션 8 번째,표 35-9. (을 위한 자세한 정보 참조사설 토토 사이트 : 문서 : 9.2 : 사설 토토 사이트 Indexes.)
표 35-9. GIST 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
일관성 |
키가 쿼리를 만족시키는 지 결정합니다 예선 | 1 |
Union |
열쇠 세트의 Union Compute Union | 2 |
압축 |
키 또는 압축 된 표현 계산 또는 색인 값 | 3 |
Decompress |
a의 압축 압축 표현 계산 압축 키 | 4 |
페널티 |
새 키를 하위 트리에 삽입하기위한 페널티 컴퓨팅 주어진 하위 트리의 키로 | 5 |
picksplit |
이동할 페이지의 항목 결정 결정 새 페이지에 결과 페이지 | 6 |
Equal |
두 개의 키를 비교하고 그렇다면 참으로 반환하십시오 동일한 | 7 |
거리 |
키에서 쿼리 값까지의 거리를 결정하십시오 (선택 과목) | 8 |
SP-Gist 인덱스에는 5 가지 지원 기능이 필요합니다.테이블 35-10. (자세한 내용은 참조54 장.)
표 35-10. SP-Gist 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
config |
운영자에 대한 기본 정보를 제공합니다 수업 | 1 |
선택 |
새 값을 내부에 삽입하는 방법 결정 튜플 | 2 |
picksplit |
값 세트를 분할하는 방법 결정 | 3 |
Inner_consistent |
어떤 하위 파티션을 검색 해야하는지 결정하십시오 쿼리 용 | 4 |
Leaf_consistent |
키가 쿼리를 만족하는지 여부를 결정합니다 예선 | 5 |
GIN 인덱스에는 선택 사항이있는 4 개의 지원 기능이 필요합니다 다섯째,표 35-11. (을 위한 자세한 정보 참조스포츠 토토 : 문서 : 9.2 : 진 인덱스.)
표 35-11. 진 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
비교 |
두 키를 비교하고 정수를보다 적게 반환하십시오 0, 0보다 큰 0보다 큽니다 첫 번째 키는 두 번째 | 1 |
ExtractValue |
인덱싱 할 값에서 키를 추출 | 2 |
ExtractQuery |
쿼리 조건에서 키를 추출 | 3 |
일관성 |
값이 쿼리와 일치하는지 여부를 결정합니다 상태 | 4 |
비교파 |
인덱스에서 쿼리와 키에서 부분 키 비교, 정수를 0, 0 또는 더 큰 반환 0보다 진이 이것을 무시 해야하는지 여부를 나타냅니다 인덱스 항목, 항목을 일치로 취급하거나 중지 인덱스 스캔 (선택 사항) | 5 |
검색 연산자와 달리 지원 함수는 그 어느 쪽이든 반환합니다 데이터 유형 특정 인덱스 방법이 기대하는; 예를 들어 B- 트리의 비교 함수의 경우, A 서명 된 정수. 각 지원에 대한 인수의 수와 유형 함수는 마찬가지로 인덱스 방법에 따라 다릅니다. B- 트리의 경우 해시 비교 및 해싱 지원 기능은 연산자와 동일한 입력 데이터 유형 운영자 클래스이지만 이것은 대부분의 요점의 경우가 아닙니다. SP-Gist 및 진 지원 기능.
이제 우리는 아이디어를 보았으니 여기에 약속 된 것입니다. 새로운 운영자 클래스 생성의 예. (당신은 찾을 수 있습니다 이 예제의 작업 사본SRC/Tutorial/Complex.c및src/튜토리얼/complex.sql소스에서 배포.) 운영자 클래스는 연산자를 캡슐화합니다 절대 값 순서로 복소 번호를 정렬하므로 이름complex_abs_ops. 먼저, 우리는 필요합니다 운영자 세트. 운영자를 정의하는 절차 논의스포츠 토토 : 문서 : 9.2 : 사용자 정의 연산자. For an B- 트리의 운영자 클래스, 우리가 필요로하는 운영자는 다음과 같습니다.
관련 세트를 정의하는 최소 오류가 발생하기 쉬운 방법 비교 연산자는 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 (complex, complex)를 반환합니다 처럼 '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 동일한 SQL 이름을 가진 함수에 대처 그들은 다른 인수 데이터 유형을 가지고 있으며, c 는만 대처할 수 있습니다. 하나의 글로벌 기능이 주어진 이름을 갖습니다. 그래서 우리 C 기능의 이름을 지정해서는 안됩니다.abs_eq. 일반적으로 좋습니다 C 함수에 데이터 유형 이름을 포함시키는 연습 다른 데이터의 함수와 충돌하지 않도록 이름, 유형.
우리는 함수의 SQL 이름을 만들 수있었습니다abs_eq, 의존PostgreSQL그것을 구별합니다 다른 SQL 기능의 인수 데이터 유형 이름. 예제를 단순하게 유지하기 위해 기능에 C 레벨 및 SQL 레벨에서 동일한 이름.
다음 단계는 지원 루틴 등록입니다. B- 트리에 필요합니다. 이것을 구현하는 예제 C 코드 연산자 함수가 포함 된 동일한 파일에서. 이것은 기능을 선언하는 방법 :
함수 만들기 complex_abs_cmp (복잡하고 복잡한) 정수를 반환합니다 처럼 'filename' 언어 c 불변의 엄격한;
이제 필요한 연산자와 지원 루틴을 보유하고 있습니다. 우리는 마침내 운영자 클래스를 만들 수 있습니다 :
운영자 클래스 complex_abs_ops 만들기 btree as를 사용하여 유형 복합체의 기본값 연산자 1 <, 연산자 2 <=, 연산자 3 =, 연산자 4 =, 연산자 5, 함수 1 Complex_ABS_CMP (Complex, Complex);
그리고 우리는 끝났습니다! 이제 만들고 사용할 수 있어야합니다 B- 트리 색인복잡한열.
운영자 항목을 더 구두로 쓸 수있었습니다. 에서와 같이 :
연산자 1 <(복잡한, 복잡한),
그러나 운영자가 동일한 데이터 유형 우리는 운영자 클래스를 정의하는 것과 동일합니다.
위의 예는이 새로운 것을 만들고 싶다고 가정합니다. 운영자 클래스의 기본 B- 트리 연산자 클래스복잡한데이터 유형. 그렇지 않다면, 그냥 단어를 남겨주세요기본값.
지금까지 우리는 운영자 클래스가 암시 적으로 가정했습니다. 하나의 데이터 유형 만 처리합니다. 확실히있을 수 있습니다 특정 인덱스 열에서 하나의 데이터 유형 만 인덱스 된 열을 다른 데이터 유형의 값. 또한 a 운영자 클래스와 관련하여 데이터 크로스 유형 연산자, 종종 다른 데이터 유형이 관련된 경우입니다. 자체 운영자 클래스. 만드는 것이 도움이됩니다 관련 클래스 간의 연결은 명시 적입니다 Planner가 SQL 쿼리를 최적화하는 데 도움이됩니다 (특히 플래너에는 위대한 것이 있기 때문에 B- 트리 운영자 클래스 그들과 함께 일하는 방법에 대한 지식의 거래).
이러한 요구를 처리하려면PostgreSQLAN의 개념 사용운영자 가족. 운영자 가족 하나 이상의 운영자 클래스가 포함되어 있으며 인덱스 가능한 연산자 및 해당 지원 기능 가족 전체에 속하지만 단일 수업은 아닙니다. 가족 안에서. 우리는 그러한 운영자와 기능이라고 말합니다."느슨한"가족 내에서 특정 클래스에 묶여있는 것에 반대합니다. 일반적으로 각각 운영자 클래스에는 단일 데이터 유형 연산자가 포함되어 있습니다 가족의 교차 데이터 유형 운영자가 느슨합니다.
운영자 가족의 모든 운영자와 기능은 호환성 요구 사항이있는 시맨틱이 있습니다 인덱스 메소드에 의해 설정됩니다. 그러므로 당신은 이유가 궁금 할 것입니다 가족의 특정 하위 집합을 단독으로 사용하여 운영자 클래스; 그리고 실제로 많은 목적을 위해 수업 분열은 관련이없고 가족은 유일한 흥미로운 일입니다. 그룹화. 운영자 클래스를 정의하는 이유는 그것들 때문입니다 지원하는 데 필요한 가족의 양을 지정하십시오. 특정 지수. 연산자 클래스를 사용하여 인덱스가있는 경우 그러면 해당 운영자 클래스는 색인 - 그러나 운영자 제품군의 다른 부분, 즉 다른 부분 운영자 클래스와 느슨한 연산자를 떨어 뜨릴 수 있습니다. 따라서, 최소값을 포함하도록 운영자 클래스를 지정해야합니다. 합리적으로 필요한 운영자 및 기능 세트 특정 데이터 유형에서 인덱스로 작업 한 다음 관련 그러나 비 필수 운영자는 느슨한 구성원으로 추가 될 수 있습니다. 운영자 가족.
예를 들어PostgreSQL내장 B- 트리 운영자 제품군이 있습니다integer_ops, 여기에는 운영자 클래스 포함int8_ops, int4_ops및int2_ops토토 커뮤니티의 경우bigint(int8),Integer(int4) 및smallint(int242456_42757
btree를 사용하여 운영자 패밀리 integer_ops 만들기; 연산자 클래스 int8_ops를 만듭니다 btree family integer_ops를 사용하여 int8 유형의 기본값 - 표준 INT8 비교 연산자 1 <, 연산자 2 <=, 연산자 3 =, 연산자 4 =, 연산자 5, 함수 1 btint8cmp (int8, int8), 함수 2 btint8sortsupport (내부); 연산자 클래스 int4_ops를 만듭니다 btree family integer_ops를 사용하여 int4 유형의 기본값 - 표준 INT4 비교 연산자 1 <, 연산자 2 <=, 연산자 3 =, 연산자 4 =, 연산자 5, 함수 1 btint4cmp (int4, int4), 함수 2 btint4sortsupport (내부); 연산자 클래스 int2_ops를 만듭니다 btree family integer_ops를 사용하여 유형 int2에 대한 기본값 - 표준 INT2 비교 연산자 1 <, 연산자 2 <=, 연산자 3 =, 연산자 4 =, 연산자 5, 함수 1 btint2cmp (int2, int2), 함수 2 btint2Sortsupport (내부); BTREE ADD를 사용하여 운영자 패밀리 integer_ops를 변경합니다 -교차 유형 비교 INT8 대 INT2 연산자 1 <(int8, int2), 연산자 2 <= (int8, int2), 연산자 3 = (int8, int2), 연산자 4 = (int8, int2), 연산자 5 (int8, int2), 함수 1 btint82cmp (int8, int2), -교차 유형 비교 INT8 vs int4 연산자 1 <(int8, int4), 연산자 2 <= (int8, int4), 연산자 3 = (int8, int4), 연산자 4 = (int8, int4), 연산자 5 (int8, int4), 함수 1 btint84cmp (int8, int4), -교차 유형 비교 INT4 vs int2 연산자 1 <(int4, int2), 연산자 2 <= (int4, int2), 연산자 3 = (int4, int2), 연산자 4 = (int4, int2), 연산자 5 (int4, int2), 함수 1 btint42cmp (int4, int2), -교차 유형 비교 INT4 vs int8 연산자 1 <(int4, int8), 연산자 2 <= (int4, int8), 연산자 3 = (int4, int8), 연산자 4 = (int4, int8), 연산자 5 (int4, int8), 함수 1 btint48cmp (int4, int8), -교차 유형 비교 INT2 vs int8 연산자 1 <(int2, int8), 연산자 2 <= (int2, int8), 연산자 3 = (int2, int8), 연산자 4 = (int2, int8), 연산자 5 (int2, int8), 함수 1 btint28cmp (int2, int8), -교차 유형 비교 INT2 vs int4 연산자 1 <(int2, int4), 연산자 2 <= (int2, int4), 연산자 3 = (int2, int4), 연산자 4 = (int2, int4), 연산자 5 (int2, int4), 함수 1 btint24cmp (int2, int4);
이 정의를 알아라"오버로드"운영자 전략 및 지원 함수 번호 : 각 숫자는 여러 번 발생합니다 가족. 이것은 각각의 인스턴스만큼 허용됩니다. 특정 숫자에는 입력 데이터 유형이 다릅니다. 인스턴스 운영자 클래스의 입력과 동일한 두 입력 유형이 있습니다. 유형은 기본 연산자이며 이에 대한 지원 기능입니다. 운영자 클래스, 대부분의 경우 느슨한 멤버가 아닌 운영자 클래스 가족.
B- 트리 운영자 제품군에서 가족의 모든 운영자 양립적으로 정렬해야합니다 가족이 지원하는 모든 데이터 유형에서 :"A = B와 B = C 인 경우 A = C"및"a <b와 b <c이면 a < 기음". 또한, 암시 적 또는 이진 강요는 사이에 캐스트됩니다 운영자 제품군에 표시되는 유형은 관련 정렬 주문. 가족의 각 운영자에 대해 동일한 두 입력 데이터 유형을 갖는 지원 기능이어야합니다. 연산자로서. 가족이 완성하는 것이 좋습니다. 즉, 각 데이터 유형의 조합에 대해 모든 운영자는 다음과 같습니다. 포함. 각 운영자 클래스에는 만 포함해야합니다 비 크로스 유형 운영자 및 데이터에 대한 지원 기능 유형.
다중 데이터 유형 해당 운영자 제품군을 구축하려면, 각 데이터에 대해 호환 해시 지원 기능을 작성해야합니다. 가족이 지원하는 유형. 여기서 호환성은 함수는 동일한 해시 코드를 반환하도록 보장됩니다. 가족의 평등에 의해 동등한 것으로 간주되는 두 가지 가치 값이 다른 유형 인 경우에도 연산자. 이것은 일반적으로 유형이 다를 때 달성하기가 어렵습니다 물리적 표현이지만 경우에 따라 수행 할 수 있습니다. 또한, 하나의 데이터 유형에서 값을 표시하는 다른 데이터 유형에 대한 운영자 제품군도 암시 적 또는 이진 강요 캐스트를 통한 운영자 제품군 계산 된 해시 값을 변경해서는 안됩니다. 존재한다는 것을 주목하십시오 평등 당 하나가 아닌 데이터 유형 당 하나의 지원 기능 만 연산자. 가족이 완성되는 것이 좋습니다. 각 데이터 조합에 대한 평등 연산자를 제공하십시오 유형. 각 운영자 클래스에는 만 포함해야합니다 비 크로스 유형 평등 연산자 및 지원 기능 데이터 유형.
GIST, SP-GIST 및 GIN Index에는 명시 적이 없습니다. 교차 데이터 유형 운영 개념. 연산자 세트 지원되는 것은 단지 기본 지원 기능이 무엇이든 주어진 운영자 클래스는 처리 할 수 있습니다.
참고 :이전PostgreSQL8.3, 개념이 없었다 운영자 패밀리 및 모든 교차 데이터 유형 운영자 인덱스와 함께 사용되도록 의도 된 것은 직접 구속되어야했습니다. 인덱스의 운영자 클래스로. 이 접근법은 여전히 작동하면 인덱스를 만들기 때문에 더 이상 사용되지 않습니다 의존성이 너무 넓고 플래너가 처리 할 수 있기 때문입니다 두 데이터가 두 데이터를보다 효과적으로 비교할 수 있습니다 유형은 동일한 운영자 제품군에 운영자가 있습니다.
PostgreSQL운영자를 사용합니다 더 많은 방법으로 운영자의 속성을 추론하는 클래스 인덱스와 함께 사용할 수 있는지 여부. 그러므로 당신은 없더라도 운영자 클래스를 만들고 싶을 수도 있습니다. 데이터 유형의 모든 열을 인덱싱하려는 의도
특히와 같은 SQL 기능이 있습니다.주문 byand별도의값의 비교 및 정렬이 필요합니다. 구현하려면 사용자 정의 데이터 유형의 이러한 기능PostgreSQL기본 B- 트리를 찾습니다 데이터 유형의 연산자 클래스. 그만큼"Equals"이 운영자 클래스의 구성원은 정의합니다 시스템의 가치 평등 개념에 대한그룹 byand별개의, 그리고 운영자 클래스가 부과하는 정렬 순서는 다음을 정의합니다. 기본주문 by주문.
사용자 정의 유형의 배열 비교도 의존합니다 기본 B-Tree 연산자 클래스에 의해 정의 된 의미론.
데이터에 대한 기본 B-Tree 연산자 클래스가없는 경우 유형, 시스템은 기본 해시 운영자 클래스를 찾습니다. 그러나 이러한 종류의 운영자 클래스는 평등만을 제공하기 때문에 실제로는 배열 평등을 지원하기에 충분합니다.
데이터 유형에 대한 기본 연산자 클래스가 없으면 와 같은 오류가 발생합니다."를 식별 할 수 없었습니다 오퍼레이터 주문 "이 SQL 기능을 사용하려는 경우 데이터 유형으로.
참고 :inpostgresql7.4 이전 버전, 정렬 및 그룹화 작업은 암시 적으로 사용됩니다 운영자 이름=, <및. 그만큼 기본 연산자 클래스에 의존하는 새로운 동작은 피합니다 행동에 대해 어떤 가정을해야합니다 특정 이름을 가진 운영자.
또 다른 중요한 점은 해시 운영자 가족은 해시 조인 후보자입니다. 집계 및 관련 최적화. 해시 연산자 가족은 해시를 식별하기 때문에 여기서 필수적입니다 사용하는 기능.
일부 인덱스 액세스 방법 (현재 GIST)이 지원합니다 의 개념주문 연산자. 우리가 뭐야 지금까지 논의를 해왔으며검색 연산자. 검색 연산자는 토토 커뮤니티가 할 수있는 것입니다. 만족스러운 모든 행을 찾기 위해 검색어디 indexed_column 운영자 Constant. 약속 된 것은 없습니다 일치하는 행이 반환되는 순서에 대해. ~ 안에 대조적으로, 주문 연산자는 세트를 제한하지 않습니다. 반환 할 수 있지만 대신 주문을 결정합니다. 주문 연산자는 인덱스를 스캔 할 수있는 것입니다. 순서대로 행을 반환하려면주문 by indexed_column 운영자 Constant. 정의 이유 그런 식으로 운영자를 주문하는 것은 지원하는 것입니다 운영자가 측정하는 경우 가장 가까운 이웃 검색 거리. 예를 들어, 쿼리와 같은
선택 * 위치별로 주문에서 <- 포인트 '(101,456)'Limit 10;
주어진 목표 지점에 가장 가까운 10 개의 장소를 찾습니다. 요점 위치 열의 색인은이기 때문에 효율적으로 수행 할 수 있습니다.<--주문 연산자입니다.
검색 연산자가 부울 결과를 반환 해야하는 동안 주문 연산자는 일반적으로 다른 유형을 반환합니다 거리의 플로트 또는 숫자. 이 유형은 일반적으로 그렇지 않습니다 인덱싱되는 데이터 유형과 동일합니다. 열심히지는 것을 피하기 위해 다른 데이터 유형의 동작에 대한 가정, the 주문 연산자의 정의는 B- 트리의 이름을 지정해야합니다. 결과의 정렬 순서를 지정하는 운영자 제품군 데이터 유형. 이전 섹션에서 언급 된 바와 같이, B-Tree 운영자 가족 정의PostgreSQL의 순서 개념 자연스러운 표현입니다. 포인트 이후<--운영자 반환float8, 운영자 클래스에 지정할 수 있습니다 다음과 같은 창조 명령 :
Operator 15 <- (Point, Point) float_ops의 순서
여기서float_ops내장 된 것입니다 운영을 포함하는 운영자 가족float8. 이 선언은 지수가 값의 증가 순서대로 행을 반환 할 수 있습니다<--연산자.
운영자 클래스에는 두 가지 특별한 기능이 있습니다. 아직 유용하지 않기 때문에 아직 논의하지 않았습니다. 가장 일반적으로 사용되는 색인 방법.
일반적으로 운영자의 구성원으로 연산자를 선언합니다. 클래스 (또는 가족)는 인덱스 메소드가 검색 될 수 있음을 의미합니다. 정확히 a를 만족시키는 행 세트여기서연산자를 사용한 상태. 을 위한 예:
선택 *에서 integer_column <4; 테이블에서
정수의 B-Tree 지수에 의해 정확히 충족 될 수 있습니다. 열. 그러나 색인이 유용한 경우가 있습니다. 일치하는 행에 대한 부당한 안내서. 예를 들어, 요점 인 경우 인덱스는 기하학적 객체에 대한 경계 상자 만 저장하고, 그 다음 정확히 만족할 수 없습니다여기서테스트를 테스트하는 조건은 비 응집체 물체 사이에 겹칩니다 다각형과 같은. 그러나 우리는 색인을 사용하여 개체를 찾을 수 있습니다 경계 상자가 대상의 경계 상자와 겹치는 사람 개체, 그런 다음 객체에서만 정확한 오버랩 테스트를 수행하십시오. 색인에서 발견되었습니다. 이 시나리오가 적용되면 인덱스가 표시됩니다 장차 ~ 가 되는"Lossy"운영자의 경우. Lossy Index 검색은 인덱스 방법을 사용하여 구현됩니다. 반환 a다시 확인행이있을 때 플래그 또는 실제로 쿼리 조건을 만족시키지 못할 수도 있습니다. 핵심 그런 다음 시스템은 원래 쿼리 조건을 테스트합니다. 검색 된 행을 유효한 것으로 반환 해야하는지 확인했습니다. 성냥. 이 접근법은 인덱스가 반환을 보장하는 경우 작동합니다. 필요한 모든 행과 아마도 추가 행, 원래 연산자를 수행하여 제거 할 수 있습니다 기도. 손실 검색을 지원하는 색인 메소드 (현재, Gist, SP-Gist 및 Gin)는 지원 기능을 허용합니다 개별 운영자 클래스의 재전송 플래그를 설정하는 등 이것은 본질적으로 운영자 클래스 기능입니다.
우리가 보관하는 상황을 다시 고려하십시오. 와 같은 복잡한 객체의 경계 상자 만 색인 다각형. 이 경우 저장에는 가치가 많지 않습니다. 인덱스 항목의 전체 다각형 - 우리는 단지 저장할 수도 있습니다. 유형의 간단한 대상Box. 이것 상황은에 의해 표현됩니다.스토리지옵션운영자 클래스 생성: 우리는 다음과 같은 글을 쓰십시오 :
운영자 클래스 Polygon_ops를 만듭니다 GIST AS를 사용하여 유형 다각형의 기본값 ... 스토리지 박스;
현재, GIST 및 GIN 색인 메소드 만 지원 A스토리지열 데이터 유형. The Gistcompress
및Decompress
지원 루틴은 처리해야합니다
데이터 유형 변환스토리지IS
사용된. 진에서스토리지타입
의 유형을 식별합니다"키"값은 일반적으로 유형과 다릅니다.
인덱스 된 열 - 예를 들어, 운영자 클래스와 같은
정수 배열 열에는 정수가있는 키가있을 수 있습니다.
진ExtractValue
andExtractQuery
지원 루틴입니다
인덱스 값에서 키를 추출하는 책임.