Postgresql 9.3.25 문서화 | ||||
---|---|---|---|---|
PostgreSQL : 문서 : 9.3 : 토토 베이 최적화 정보 | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 35 장. 확장SQL | 다음 |
지금까지 설명한 절차로 새로운 유형을 정의 할 수 있습니다. 기능 및 신규 연산자. 그러나 우리는 아직 정의 할 수 없습니다 새 데이터 유형의 열에서 색인. 이렇게하려면를 정의해야합니다.운영자 클래스새 데이터 유형의 경우. 이 섹션의 뒷부분에서 우리는이 개념을 예 : B-Tree 와이즈 토토 방법에 대한 새로운 운영자 클래스 절대 값을 올리는 복소수를 저장 및 정렬합니다 주문하다.
운영자 클래스를 그룹으로 그룹화 할 수 있습니다운영자 가족의미 적으로 호환 가능한 클래스. 단일 데이터 유형 만있는 경우 관련, 운영자 클래스로 충분하므로 이에 집중할 것입니다. 먼저 사례와 운영자 가족으로 돌아갑니다.
thePG_AM
테이블에는 한 행이 포함되어 있습니다
모든 와이즈 토토 방법 (내부적으로 액세스 방법으로 알려짐). 지원하다
테이블에 대한 정기적 인 액세스를 위해PostgreSQL이지만 모든 색인 방법이 있습니다
설명PG_AM
. 가능합니다
필요한 인터페이스를 정의하여 새 와이즈 토토 메소드를 추가하려면
루틴을 한 다음에서 행 생성PG_AM
- 그러나 이것은 이것의 범위를 벗어납니다
챕터 ( 참조PostgreSQL : 문서 : 9.3 : 인덱스 메이저 토토 사이트 방법 인터페이스 정의).
와이즈 토토 방법의 루틴은 아무것도 직접 알지 못합니다. 와이즈 토토 방법이 작동하는 데이터 유형에 대해 대신, an운영자 클래스와이즈 토토 방법이 특정 데이터 유형. 오퍼레이터 클래스는 하나 때문에 호출됩니다 그들이 지정한 것은의 집합입니다.여기서-an과 함께 사용할 수있는 사고 연산자 와이즈 토토 (즉, 와이즈 토토 스캔 자격으로 변환 될 수 있음). an 운영자 클래스도 일부를 지정할 수 있습니다지원 절차의 내부 작업에 필요합니다 색인 방법이지만 직접적으로 해당하지 않습니다여기서-Clause 연산자와 함께 사용할 수 있습니다 색인.
동일하게 여러 연산자 클래스를 정의 할 수 있습니다. 데이터 유형 및 와이즈 토토 방법. 이렇게하면 여러 세트가 있습니다 단일 데이터 유형에 대해 인덱싱 의미를 정의 할 수 있습니다. 을 위한 예를 들어, B-Tree 지수는 정렬 순서를 정의해야합니다. 작동하는 각 데이터 유형. 복잡한 수에 유용 할 수 있습니다 데이터 유형은 데이터를 복잡한 절대 값, 실제 부분으로 분류하는 것 등. 일반적으로 운영자 클래스 중 하나가 가장 일반적으로 간주됩니다. 유용하며 기본 연산자 클래스로 표시됩니다. 데이터 유형 및 색인 방법.
동일한 연산자 클래스 이름은 여러 다른 경우 사용될 수 있습니다. 와이즈 토토 방법 (예 : B-Tree 및 Hash Index Method는 모두 운영자 클래스 이름int4_ops) 그러나 각각 이러한 클래스는 독립적 인 엔티티이며 정의되어야합니다. 갈라져.
운영자 클래스와 관련된 연산자가 식별됩니다 에 의해"전략 번호"각 연산자의 의미를 식별하십시오. 운영자 클래스. 예를 들어, B- 트리는 엄격한 순서를 부과합니다 키, 더 큰 키, 그리고 운영자는""보다 작습니다.and"더 큰 OR "와 같습니다.B- 트리와 관련하여 흥미 롭습니다. 왜냐하면PostgreSQL사용자가 허용합니다 연산자 정의PostgreSQL연산자의 이름을 볼 수 없습니다 (예 :<또는 =) 어떤 종류의 비교. 대신 와이즈 토토 메소드는 a를 정의합니다 세트"전략"일반화 된 운영자로 생각했습니다. 각 운영자 클래스는 지정합니다 특정 운영자가 특정 전략에 해당하는 것은 와이즈 토토 의미의 데이터 유형 및 해석.
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 |
contains | 7 |
8 | |
위에 확장되지 않습니다 | 9 |
엄격하게 아래 | 10 |
엄격하게 위 | 11 |
아래로 확장되지 않습니다 | 12 |
SP-Gist 와이즈 토토는 유연성의 GIST 와이즈 토토와 유사합니다. 고정 된 전략 세트가 없습니다. 대신 지원 루틴 각 운영자 클래스의 전략 번호를 해석합니다. 운영자 클래스의 정의. 예를 들어, 전략 포인트에 대한 내장 운영자 클래스에서 사용하는 숫자가 표시됩니다. 안에테이블 35-5.
진 와이즈 토토는 GIST 및 SP-GIST 와이즈 토토와 유사합니다. 그들은 고정 된 전략 세트도 없습니다. 대신 각 운영자 클래스의 지원 루틴은 전략을 해석합니다 운영자 클래스의 정의에 따른 숫자. 로서 예를 들어, 내장 운영자 클래스에서 사용하는 전략 번호 배열이에 표시됩니다.표 35-6.
위에 나열된 모든 운영자가 부울 반환을 주목하십시오 값. 실제로 모든 연산자는 색인 메소드 검색으로 정의되었습니다 연산자는 유형을 반환해야합니다부울이후 그들은 a의 최상위 수준에 나타나야합니다.여기서와이즈 토토와 함께 사용할 조항. (일부 색인 액세스 방법도 지원주문 연산자, 일반적으로 부울 값을 반환하지 않습니다. 저것 기능에 대해섹션 35.14.7.)
전략은 일반적으로 시스템에 대한 정보가 충분하지 않습니다 와이즈 토토 사용 방법을 알아냅니다. 실제로 와이즈 토토 방법 작업하려면 추가 지원 루틴이 필요합니다. 예를 들어, B-Tree Index 방법은 두 개의 키를 비교할 수 있어야하며 하나가, 동일 또는 그 이상인지 여부를 결정합니다. 다른. 마찬가지로 해시 와이즈 토토 방법은 계산할 수 있어야합니다. 주요 값에 대한 해시 코드. 이러한 작업은 해당하지 않습니다 SQL 명령의 자격에 사용되는 운영자; 그들은입니다 내부적으로 와이즈 토토 방법에 사용되는 관리 루틴.
전략과 마찬가지로 운영자 클래스는 어떤 식별합니다 특정 기능은 주어진 데이터에 대해 이러한 각 역할을 수행해야합니다. 유형 및 시맨틱 해석. 와이즈 토토 메소드는 세트를 정의합니다 필요한 기능의 에 할당하여 사용할 올바른 기능"지원 기능 번호"와이즈 토토에 의해 지정됩니다 방법.
B- 트리는 단일 지원 기능이 필요하며 1 초를 허용합니다. 표시된대로 운영자 클래스 저자의 옵션에서 제공 할 것 안에테이블 35-7.
표 35-7. B- 트리 지원 기능
기능 | 지원 번호 |
---|---|
두 키를 비교하고 0, 0보다 적은 정수를 반환합니다. 0보다 크며 첫 번째 키가 낮은 지 여부를 나타냅니다. 두 번째보다 동일하거나 | 1 |
C-Callable Sort 지원 기능의 주소를 반환합니다 문서화utils/sortsupport.h(선택 사항) | 2 |
해시 와이즈 토토는 하나의 지원 함수가 필요합니다.표 35-8.
GIST 와이즈 토토에는 선택 사항이있는 7 개의 지원 기능이 필요합니다 8 번째,표 35-9. (자세한 내용 정보 참조토토 핫 : 문서 : 9.3 : 토토 핫 Indexes.)
표 35-9. GIST 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
일관성 |
키가 쿼리 예선을 만족시키는 지 결정 | 1 |
Union |
열쇠 세트의 Union Compute Union | 2 |
압축 |
가 될 키 또는 값의 압축 표현 계산 색인 | 3 |
Decompress |
압축 키의 압축 압축 표현 계산 | 4 |
페널티 |
주어진 서브 트리에 새 키를 삽입하기위한 페널티 컴퓨팅 Subtree의 키 | 5 |
picksplit |
새로 이동할 페이지의 항목 결정 결정 결과 페이지를위한 Union 키를 계산하고 계산 | 6 |
Equal |
두 개의 키를 비교하고 동등한 경우 true를 반환합니다 | 7 |
거리 |
키에서 쿼리 값까지의 거리 결정 (선택 사항) | 8 |
SP-Gist 와이즈 토토에는 5 가지 지원 기능이 필요합니다.표 35-10. (자세한 내용은 참조스포츠 토토 : 문서 : 9.3 : SP-Gist Indexes.)
표 35-10. SP-Gist 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
config |
운영자 클래스에 대한 기본 정보 제공 | 1 |
선택 |
새 값을 내부 튜플에 삽입하는 방법 결정 | 2 |
picksplit |
값 세트를 분할하는 방법 결정 | 3 |
Inner_consistent |
a 질문 | 4 |
Leaf_consistent |
키가 쿼리 예선을 만족시키는 지 결정 | 5 |
진 와이즈 토토에는 선택 사항이있는 4 개의 지원 기능이 필요합니다 다섯째,표 35-11. (자세한 내용 정보 참조토토 커뮤니티 : 문서 : 9.3 : 진 인덱스.)
표 35-11. 진 지원 기능
기능 | 설명 | 지원 번호 |
---|---|---|
비교 |
두 키를 비교하고 0, 0보다 적은 정수를 반환합니다. 0보다 크며 첫 번째 키가 낮은 지 여부를 나타냅니다. 두 번째보다 동일하거나 | 1 |
ExtractValue |
인덱싱 할 값에서 키를 추출합니다 | 2 |
ExtractQuery |
쿼리 조건에서 키를 추출 | 3 |
일관성 |
값이 쿼리 조건과 일치하는지 여부 결정 | 4 |
비교파 |
와이즈 토토에서 쿼리와 키에서 부분 키를 비교하고 반환 0보다 작은 정수, 0 또는 0보다 큰 진이이 와이즈 토토 항목을 무시 해야하는지 여부는 항목을 일치하거나 와이즈 토토 스캔 중지 (선택 사항) | 5 |
검색 연산자와 달리 지원 기능은 데이터를 반환합니다 특정 와이즈 토토 방법을 입력하십시오. 예를 들어 경우 B- 트리의 비교 함수, 서명 된 정수. 그만큼 각 지원 함수에 대한 인수의 수와 유형은 다음과 같습니다. 마찬가지로 와이즈 토토 방법에 따라 다릅니다. B- 트리 및 해시의 경우 비교 및 해싱 지원 기능은 동일한 입력 데이터를 취합니다. 운영자가 운영자 클래스에 포함 된대로 유형이지만 대부분의 요점, SP-Gist 및 진 지원의 경우에는 해당되지 않습니다. 기능.
이제 우리는 아이디어를 보았으므로 다음은 약속 된 예입니다. 새 운영자 클래스 생성. (이 사본을 찾을 수 있습니다 의 예제SRC/Tutorial/Complex.candsrc/튜토리얼/complex.sql소스에서 배포.) 운영자 클래스는 정렬 된 연산자를 캡슐화합니다 절대 값 순서의 복소수이므로 이름을 선택합니다complex_abs_ops. 먼저, 우리는 세트가 필요합니다 운영자. 운영자를 정의하는 절차는에서 논의되었습니다.무지개 토토 : 문서 : 9.3 : 무지개 토토 정의 연산자. 운영자 클래스의 경우 B- 트리, 우리가 필요로하는 운영자는 다음과 같습니다.
관련 비교 세트를 정의하는 최소 오류가 발생하기 쉬운 방법 연산자는 먼저 B-Tree 비교 지원 기능을 작성하는 것입니다. 그런 다음 다른 기능을 한 줄 랩퍼로 작성하십시오. 지원 기능. 이것은 일관성이없는 확률을 줄입니다 코너 케이스에 대한 결과. 이 접근법에 따라 우리는 먼저 쓰다:
#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) bool을 반환합니다 처럼 'filename','complex_abs_lt ' 언어 C 불변의 엄격; 연산자 생성 <( leftarg = complex, rightarg = complex, process = complex_abs_lt, Commutator =, Negator = =, scalarltsel giant = scalarltjoinsel join = scalarltsel );
올바른 통근자 및 부정자를 지정하는 것이 중요합니다. 연산자뿐만 아니라 적절한 제한 및 결합 선택성 함수, 그렇지 않으면 최적화기가 효과적이지 않습니다. 색인 사용. 덜, 평등하고, 더 큰 것에 주목하십시오 사례는 다른 선택성 함수를 사용해야합니다.
주목할만한 다른 일이 여기에서 일어나고 있습니다 :
이름이 하나만있을 수 있습니다.=및 유형 복용복잡한두 피연산자. 이 경우 다른 운영자가 없습니다=for복잡한그러나
우리가 실용적인 데이터 유형을 구축하고 있다면 아마도 원할 것입니다=일반 평등 작전이되기 위해
복소수의 경우 (절대 값의 평등이 아님).
이 경우 다른 운영자 이름을 사용해야합니다.complex_abs_eq
.
비록PostgreSQLCAPE 기능이있는 것과 동일한 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- 트리 연산자 클래스복잡한데이터 유형. 그렇지 않으면 그냥 나가십시오 단어기본값.
지금까지 우리는 운영자 클래스가 거래한다고 암시 적으로 가정했습니다. 하나의 데이터 유형만으로. 확실히 하나의 데이터 만있을 수 있습니다 특정 와이즈 토토 열을 입력하면 종종 와이즈 토토에 유용합니다. 와이즈 토토 된 열을 다른 값과 비교하는 작업 데이터 유형. 또한 크로스 데이터 유형 연산자에 사용되는 경우 운영자 클래스와의 연결은 종종 다른 데이터 유형에는 자체 관련 연산자 클래스가 있습니다. 그것은 관련 클래스 간의 연결을 명시 적으로 만드는 데 도움이됩니다. 이것은 플래너가 SQL 쿼리 최적화에 도움이 될 수 있기 때문에 (특히 플래너 이후 B- 트리 운영자 클래스의 경우 작업 방법에 대한 많은 지식이 포함되어 있습니다. 그들을).
이러한 요구를 처리하려면PostgreSQLAN의 개념 사용운영자 가족. 운영자 패밀리에는 하나 또는가 포함됩니다 더 많은 운영자 클래스, 와이즈 토토 가능한 운영자 및 가족에게 속한 해당 지원 기능은 가족 내의 단일 수업은 아닙니다. 우리는 그렇게 말합니다 그러한 연산자와 기능은"느슨한"특정 클래스에 묶여있는 것이 아니라 가족 내에서. 일반적으로 각 운영자 클래스에는 단일 데이터 유형 연산자가 포함됩니다 가족은 데이터 크로스 타입 운영자가 느슨하지만.
운영자 가족의 모든 운영자와 기능은 호환 시맨틱, 호환성 요구 사항이 설정되어 있습니다 와이즈 토토 방법으로. 그러므로 당신은 왜 귀찮게하는지 궁금 할 것입니다 운영자 클래스로서 가족의 특정 하위 집합을 단일 배제합니다. 그리고 실제로 많은 목적을 위해 계급 부서는 관련이 없으며 가족은 유일한 흥미로운 그룹입니다. 이유 운영자 클래스를 정의하는 것입니다. 특정 지수를 지원하려면 가족이 필요합니다. 있는 경우 운영자 클래스를 사용하여 색인을 사용하면 해당 연산자 클래스가 색인을 떨어 뜨리지 않고 떨어졌지만 다른 부분 운영자 가족, 즉 다른 운영자 클래스 및 느슨한 운영자, 떨어질 수 있습니다. 따라서 운영자 클래스를 지정해야합니다 최소 연산자 및 기능을 포함합니다. 특정 데이터 유형에서 와이즈 토토를 사용하는 데 합리적으로 필요하며 그런 다음 관련이지만 필수적인 운영자는 느슨하게 추가 할 수 있습니다. 운영자 가족의 구성원.
예를 들어,PostgreSQLa 내장 B- 트리 운영자 가족integer_ops, 여기에는 운영자 클래스 포함int8_ops, int4_ops및int2_ops와이즈 토토bigint(int8),정수(int4) 및smallint(int236533_36818
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-Tree 운영자 제품군에서 가족의 모든 운영자 호환 적으로 정렬해야합니다. 가족이 지원하는 모든 데이터 유형 :"IF a = b와 b = c, 그런 다음 a = c "및"a <b와 b <c, 그런 다음 a <c ". 또한 암시 적 또는 이진 강요는 연산자에 표시된 유형간에 캐스트됩니다 가족은 관련 정렬 순서를 변경해서는 안됩니다. 각각에 대해 가족의 운영자는 연산자와 동일한 두 입력 데이터 유형. 권장됩니다 가족이 완료됩니다. 즉, 각 데이터 유형의 각 조합에 대해 운영자가 포함되어 있습니다. 각 운영자 클래스에는 만 포함해야합니다 비 크로스 유형 운영자 및 데이터에 대한 지원 기능 유형.
다중 데이터 유형 해당 운영자 제품군을 구축하려면 호환됩니다 지원되는 각 데이터 유형에 대해 해시 지원 기능을 작성해야합니다. 가족에 의해. 여기서 호환성은 함수가 있음을 의미합니다 두 값에 대해 동일한 해시 코드를 반환하도록 보장 가족의 평등 운영자에 의해 동등한 것으로 간주됩니다. 값은 다른 유형입니다. 이것은 일반적으로 어렵습니다 유형에 물리적 표현이 다를 때 달성하고 그러나 어떤 경우에는 수행 할 수 있습니다. 또한, 값을 캐스팅합니다 운영자 제품군에 다른 데이터 유형을 다른 데이터로 표시 내재적 또는 이진 강요 캐스트는 계산 된 해시 값을 변경해서는 안됩니다. 데이터 유형 당 하나의 지원 기능만이 있지 않으며 평등 운영자 당 하나. 가족이 권장됩니다 즉, 각 조합에 대한 평등 연산자를 제공합니다 데이터 유형의. 각 운영자 클래스에는 만 포함해야합니다 비 크로스 유형 평등 연산자 및 그 지원 기능 데이터 유형.
Gist, SP-Gist 및 Gin Indexes는 명시 적 개념이 없습니다. 크로스 데이터 유형 운영. 지원되는 운영자 세트는입니다 주어진 연산자의 기본 지원 기능이 무엇이든 클래스는 처리 할 수 있습니다.
참고 :이전PostgreSQL8.3, 개념은 없었다 운영자 패밀리, 따라서 모든 교차 데이터 유형 운영자가 의도했습니다 와이즈 토토와 함께 사용되어야합니다. 운영자 클래스. 이 접근법은 여전히 작동하지만 더 이상 사용되지 않습니다 와이즈 토토의 종속성을 너무 넓기 때문에 플래너는 교차 데이터 유형 비교를보다 효과적으로 처리 할 수 있습니다 두 데이터 유형 모두 동일한 연산자에 연산자가있는 경우 가족.
PostgreSQL운영자를 사용합니다 연산자의 속성을 추론하는 클래스 와이즈 토토와 함께 사용할 수 있는지 여부. 따라서 원할 수도 있습니다 인덱싱 의도가 없어도 운영자 클래스 생성 데이터 유형의 모든 열.
특히와 같은 SQL 기능이 있습니다.주문 byand별도의값의 비교 및 정렬이 필요합니다. 이것들을 구현합니다 사용자 정의 데이터 유형의 기능PostgreSQL기본 B- 트리를 찾습니다 데이터 유형의 연산자 클래스. 그만큼"Equals"이 운영자 클래스의 구성원은 시스템의 가치 평등 개념에 대한그룹 에 의해and별도의및 정렬 운영자 클래스가 부과하는 주문은 기본값을 정의합니다주문 by주문.
사용자 정의 유형의 배열 비교도 기본 B- 트리 연산자 클래스에 의해 정의 된 의미론
데이터 유형에 대한 기본 B-Tree 연산자 클래스가없는 경우 시스템은 기본 해시 운영자 클래스를 찾습니다. 그러나 그 이후로 그런 종류의 운영자 클래스는 평등 만 제공합니다. 배열 평등을 지원하기에 충분합니다.
데이터 유형에 대한 기본 연산자 클래스가 없으면 귀하 와 같은 오류가 발생합니다."를 식별 할 수 없었습니다 오퍼레이터 주문 "이 SQL 기능을 사용하려고하는 경우 데이터 유형.
참고 :inPostgreSQL7.4 전 버전, 정렬 및 그룹화 작업이 가능합니다 암시 적으로 운영자라는 이름의=, <및. 기본 연산자 클래스에 의존하는 새로운 동작은 피합니다. 운영자의 행동에 대해 어떤 가정을해야 특정 이름.
또 다른 중요한 점은 해시 운영자 가족은 해시 조인 후보입니다. 집계 및 관련 최적화. 해시 운영자 제품군은입니다 여기에서 필수적으로 사용할 해시 함수를 식별하기 때문에.
일부 와이즈 토토 액세스 방법 (현재, 요점 만)이 지원합니다 의 개념주문 연산자. 우리가 뭐야 지금까지 논의를 해왔으며검색 연산자. 검색 연산자는 와이즈 토토가 될 수있는 것입니다. 만족스러운 모든 행을 찾기 위해 검색어디 indexed_column 운영자 Constant. 약속 된 것은 없습니다 일치하는 행이 반환되는 순서. 대조적으로, 주문 연산자는 할 수있는 행 세트를 제한하지 않습니다. 반환되었지만 대신 주문을 결정합니다. 주문 연산자 와이즈 토토를 스캔하여 행을 반환 할 수있는 것입니다. 주문 명령주문 by indexed_column 운영자 Constant. 주문 정의 이유 그런 식으로 운영자는 가장 가까운 이웃 검색을 지원한다는 것입니다. 연산자가 거리를 측정하는 경우. 예를 들어, 쿼리 좋다
선택 * 위치별로 주문에서 <- 포인트 '(101,456)'Limit 10;
주어진 목표 지점에 가장 가까운 10 개의 장소를 찾습니다. 요점 위치 열의 색인은이기 때문에 효율적으로 수행 할 수 있습니다.<--주문 연산자입니다.
검색 연산자가 부울 결과를 반환 해야하는 반면 주문 연산자는 일반적으로 플로트 또는 숫자와 같은 다른 유형을 반환합니다. 거리를 위해. 이 유형은 일반적으로 데이터 유형과 동일하지 않습니다. 색인. 행동에 대한 열심히 허용되는 가정을 피하기 위해 다른 데이터 유형의 순서 연산자의 정의는 다음과 같습니다. 정렬을 지정하는 B-Tree 운영자 제품군의 이름을 지정해야합니다. 결과 데이터 유형의 순서. 이전에 언급 된 바와 같이 섹션, B- 트리 운영자 가족 정의PostgreSQL의 주문 개념이므로 이것은 a입니다 자연적인 표현. 포인트 이후<--운영자 반환float8, 운영자 클래스에 지정할 수 있습니다 다음과 같은 창조 명령 :
Operator 15 <- (Point, Point) float_ops의 순서
여기서float_ops내장 된 것입니다 운영을 포함하는 운영자 가족float8. 이 선언은 와이즈 토토가 가능하다는 것을 나타냅니다 값의 값을 높이기 위해 행을 반환하려면<--운영자.
우리가 가진 운영자 클래스의 두 가지 특징이 있습니다. 아직 논의되지 않았습니다. 주로 가장 유용하지 않기 때문입니다. 일반적으로 사용되는 색인 방법.
일반적으로 운영자 클래스의 구성원으로 운영자를 선언합니다. (또는 가족)은 와이즈 토토 메소드가 정확히 a를 만족시키는 행 세트어디조건 연산자 사용. 예를 들어:
선택 *에서 integer_column <4; 테이블에서
정수의 B- 트리 지수에 의해 정확하게 만족할 수 있습니다. 열. 그러나 색인이 부적절한 것으로 유용한 경우가 있습니다. 일치하는 행에 대한 안내. 예를 들어, GIST 와이즈 토토가 저장하는 경우 기하학적 물체에 대한 경계 상자 만 만족여기서테스트 조건 다각형과 같은 비정형 물체 사이를 겹치십시오. 그러나 우리 와이즈 토토를 사용하여 경계 박스가 겹치는 객체를 찾을 수 있습니다. 대상 객체의 경계 상자, 그리고 정확한 오버랩을 수행합니다. 와이즈 토토가 발견 한 객체에서만 테스트하십시오. 이 시나리오 인 경우 적용, 색인은라고합니다."Lossy"운영자의 경우. Lossy Index 검색은 HAD에 의해 구현됩니다 와이즈 토토 메소드는 a를 반환합니다.다시 확인플래그 행이 실제로 쿼리 조건을 만족시키지 못할 수도 있습니다. 그런 다음 핵심 시스템은 원래 쿼리 조건을 테스트합니다. 검색 된 행을 유효한 것으로 반환 해야하는지 확인했습니다. 성냥. 이 접근법은 와이즈 토토가 모든 것을 반환하도록 보장되는 경우 작동합니다. 필요한 행, 아마도 추가 행, 원래 연산자 호출을 수행하여 제거됩니다. 그만큼 Lossy Searches (현재, GIST, SP-Gist 그리고 GIN) 개별 운영자 클래스의 지원 기능을 허용합니다. 재창조 깃발을 설정하려면 이것이 본질적으로 운영자 클래스 기능.
우리가 지수에 저장하는 상황을 다시 고려하십시오. 다각형과 같은 복잡한 물체의 경계 상자 만. ~ 안에 이 경우 전체 다각형을 저장하는 데는 별다른 가치가 없습니다. 와이즈 토토 항목 - 우리는 단순한 객체 만 저장할 수도 있습니다. 유형Box. 이 상황은에 의해 표현됩니다.스토리지옵션운영자 클래스 만들기: 우리는 무언가를 쓸 것입니다 좋다:
운영자 클래스 Polygon_ops를 만듭니다 GIST AS를 사용하여 유형 다각형의 기본값 ... 스토리지 박스;
현재, GIST 및 GIN 색인 메소드 만 지원 A스토리지열 데이터 유형. The Gist압축
및Decompress
지원 루틴이 필요합니다
데이터 유형 변환을 처리 할 때스토리지가 사용됩니다. 진에서스토리지유형의 유형을 식별합니다"키"값은 일반적으로와 다릅니다
와이즈 토토 열의 유형 - 예를 들어, 연산자 클래스
정수 배열 열에는 정수가있는 키가있을 수 있습니다. 그만큼
진ExtractValue
andExtractQuery
지원 루틴이 담당합니다
색인 값에서 키 추출.
이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
운영자 최적화 정보 | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 포장 관련 확장자로의 개체 |