| PostgreSQL 9.3.25 문서 | ||||
|---|---|---|---|---|
| PostgreSQL : 문서 : 9.3 : 토토 베이 최적화 정보 | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 35장. 연장SQL | 다음 | |
지금까지 설명한 절차를 통해 새로운 유형을 정의할 수 있습니다. 함수, 새로운 연산자. 그러나 아직은 정의할 수 없습니다. 새로운 데이터 유형의 열에 대한 인덱스입니다. 이를 위해서는 다음을 정의해야 합니다.연산자 클래스새 데이터 유형의 경우. 이 섹션의 뒷부분에서 이 개념을 그림으로 설명하겠습니다. 예: B-트리 인덱스 메소드에 대한 새로운 연산자 클래스 복소수를 절대값 오름차순으로 저장하고 정렬합니다. 주문하세요.
연산자 클래스는 다음과 같이 그룹화될 수 있습니다.운영자 가족사이의 관계를 보여주기 위해 의미상 호환되는 클래스. 단일 데이터 유형만 있는 경우 관련된 경우 연산자 클래스로 충분하므로 이에 집중하겠습니다. 먼저 사례를 확인한 다음 교환원 가족에게 돌아갑니다.
그pg_am테이블에는 하나의 행이 포함되어 있습니다.
모든 인덱스 방법(내부적으로는 액세스 방법이라고 함)에 대해. 지원
테이블에 대한 정기적인 액세스가 내장되어 있습니다.포스트그레SQL, 그러나 모든 색인 방법은
설명됨pg_am. 가능하다
필요한 인터페이스를 정의하여 새로운 인덱스 메소드를 추가합니다.
루틴을 생성한 다음 행을 생성합니다.pg_am—그러나 그것은 이 범위를 벗어납니다.
장(참조PostgreSQL : 문서 : 9.3 : 인덱스 메이저 토토 사이트 방법 인터페이스 정의).
와이즈 토토 메소드에 대한 루틴은 직접적으로 아무것도 알지 못합니다 와이즈 토토 메소드가 작동할 데이터 유형에 대해 설명합니다. 대신에,연산자 클래스식별합니다 인덱스 메소드가 작업을 위해 사용해야 하는 일련의 작업 특정 데이터 유형. 연산자 클래스는 다음과 같은 이유로 호출됩니다. 그들이 지정하는 것은 다음과 같습니다.어디-와 함께 사용할 수 있는 절 연산자 (즉, 인덱스 스캔 제한으로 변환될 수 있음) 안 연산자 클래스도 일부를 지정할 수 있습니다지원 절차내부 작업에 필요한 색인 방법이지만 어떤 것과도 직접적으로 일치하지 않습니다.어디에서-다음과 함께 사용할 수 있는 절 연산자 색인.
동일한 연산자 클래스를 여러 개 정의할 수 있습니다 데이터 유형 및 인덱스 방법. 이렇게 하면 여러 세트의 단일 데이터 유형에 대해 인덱싱 의미를 정의할 수 있습니다. 에 대한 예를 들어, B-트리 인덱스에는 정렬 순서를 정의해야 합니다. 작동하는 각 데이터 유형. 복소수에 유용할 수 있습니다. 데이터 유형을 기준으로 데이터를 정렬하는 하나의 B-트리 연산자 클래스를 갖습니다. 복소수 절대값, 실수부로 정렬하는 또 다른 값 등입니다. 일반적으로 연산자 클래스 중 하나가 가장 일반적으로 간주됩니다. 유용하며 해당 클래스에 대한 기본 연산자 클래스로 표시됩니다. 데이터 유형 및 인덱스 방법.
동일한 연산자 클래스 이름은 여러 다른 용도로 사용될 수 있습니다. 인덱스 방법(예: B-트리 및 해시 인덱스 방법 모두 이름이 지정된 연산자 클래스int4_ops), 하지만 각각 이러한 클래스는 독립적인 엔터티이므로 정의해야 합니다. 별도로.
연산자 클래스와 연관된 연산자가 식별됩니다 으로"전략 번호", 이는 해당 컨텍스트 내에서 각 연산자의 의미를 식별합니다. 운영자 클래스. 예를 들어 B-트리는 엄격한 순서를 적용합니다. 키가 작은 것부터 큰 것 순으로, 연산자는 다음과 같습니다."미만"그리고"보다 크거나 같음"B-트리와 관련하여 흥미롭습니다. 왜냐면PostgreSQL사용자는 다음을 수행할 수 있습니다. 연산자를 정의합니다.포스트그레SQL연산자의 이름을 볼 수 없습니다(예:<또는=) 그리고 말해요 그게 무슨 비교인지. 대신, index 메소드는 세트"전략", 이는 다음과 같습니다. 일반화된 연산자로 생각됩니다. 각 연산자 클래스는 다음을 지정합니다. 어떤 실제 연산자가 특정 전략에 해당하는지 데이터 유형 및 인덱스 의미 해석.
B-트리 인덱스 방법은 다음과 같이 5가지 전략을 정의합니다.표 35-2.
해시 인덱스는 동등 비교만 지원하므로 다음을 사용합니다. 단 하나의 전략, 다음에 표시됨표 35-3.
GiST 와이즈 토토는 더 유연합니다. 고정된 세트가 없습니다. 전혀 전략. 대신에"일관성"각 특정의 지원 루틴 GiST 연산자 클래스는 전략 번호를 해석하지만 좋아한다. 예를 들어, 내장된 GiST 인덱스 연산자 중 일부는 클래스는 2차원 기하학적 객체를 색인화하여 다음을 제공합니다."R-트리"다음에 표시된 전략표 35-4. 4개 이는 진정한 2차원 테스트입니다(겹침, 동일, 포함, 포함); 그 중 4개는 X 방향만 고려합니다. 그리고 다른 4개는 Y 방향으로 동일한 테스트를 제공합니다.
표 35-4. GiST 2차원"R-트리"전략
| 작동 | 전략 번호 |
|---|---|
| 완전히 왼쪽 | 1 |
| 오른쪽으로 확장되지 않음 | 2 |
| 겹침 | 3 |
| 왼쪽으로 확장되지 않음 | 4 |
| 완전히 오른쪽 | 5 |
| 같은 | 6 |
| 포함 | 7 |
| 다음에 의해 포함됨 | 8 |
| 위로 확장되지 않음 | 9 |
| 엄격히 아래 | 10 |
| 엄격히 위 | 11 |
| 아래로 확장되지 않음 | 12 |
SP-GiST 인덱스는 유연성 측면에서 GiST 인덱스와 유사합니다. 정해진 전략이 없습니다. 대신 지원 루틴 각 연산자 클래스는 다음에 따라 전략 번호를 해석합니다. 연산자 클래스의 정의. 예를 들어 전략은 내장 연산자 클래스에서 포인트에 사용하는 숫자가 표시됩니다. 에서테이블 35-5.
GIN 인덱스는 GiST 및 SP-GiST 인덱스와 유사합니다. 그들은 고정된 전략 세트도 갖고 있지 않습니다. 대신에 각 연산자 클래스의 지원 루틴이 전략을 해석합니다. 연산자 클래스의 정의에 따른 숫자. 로서 예, 내장 연산자 클래스에서 사용하는 전략 번호 배열은 다음에 표시됩니다.표 35-6.
위에 나열된 모든 연산자는 부울을 반환한다는 점에 유의하세요. 가치. 실제로는 와이즈 토토 메소드 검색으로 정의된 모든 연산자가 연산자는 유형을 반환해야 합니다.부울, 이후 a의 최상위 수준에 나타나야 합니다.어디색인과 함께 사용되는 절입니다. (일부 색인 액세스 방법도 지원됩니다.주문 연산자, 일반적으로 부울 값을 반환하지 않습니다. 그 기능은에서 논의됩니다.섹션 35.14.7.)
전략은 일반적으로 시스템이 수행할 수 있는 정보가 충분하지 않습니다. 인덱스를 어떻게 사용하는지 알아보세요. 실제로 인덱스 방법은 작동하려면 추가 지원 루틴이 필요합니다. 예를 들어, B-트리 인덱스 방법은 두 개의 키를 비교할 수 있어야 하며 그보다 큰지, 같은지, 작은지 판단 기타. 마찬가지로 해시 인덱스 방법은 다음을 계산할 수 있어야 합니다. 키 값의 해시 코드. 이러한 작업은 해당되지 않습니다 SQL 명령의 자격에 사용되는 연산자; 그들은 내부적으로 인덱스 메소드에서 사용되는 관리 루틴입니다.
전략과 마찬가지로 연산자 클래스는 특정 기능은 주어진 데이터에 대해 이러한 각 역할을 수행해야 합니다. 유형 및 의미 해석. 인덱스 메소드는 세트를 정의합니다. 필요한 기능을 선택하고 연산자 클래스는 사용할 올바른 함수를에 할당하여"지원 기능 번호"색인으로 지정됨 방법.
B-트리에는 단일 지원 기능이 필요하며 두 번째 지원 기능을 허용합니다. 표시된 것처럼 연산자 클래스 작성자의 선택에 따라 제공되는 것 에서테이블 35-7.
표 35-7. B-트리 지원 함수
| 기능 | 지원 번호 |
|---|---|
| 두 개의 키를 비교하여 0보다 작은 정수, 0 또는 0보다 큼, 첫 번째 키가 다음보다 작은지 여부를 나타냅니다. 두 번째와 같거나 크다 | 1 |
| C 호출 가능 정렬 지원 함수의 주소를 다음과 같이 반환합니다. 문서화됨utils/sortsupport.h(선택사항) | 2 |
해시 인덱스에는 다음과 같은 하나의 지원 기능이 필요합니다.표 35-8.
GiST 인덱스에는 7가지 지원 기능이 필요하며, 선택 사항 여덟째, 다음과 같이표 35-9. (자세한 내용은 정보 참조토토 핫 : 문서 : 9.3 : 토토 핫 Indexes.)
표 35-9. GiST 지원 기능
| 기능 | 설명 | 지원 번호 |
|---|---|---|
일관됨 |
키가 쿼리 한정자를 만족하는지 확인 | 1 |
연합 |
키 세트의 통합 계산 | 2 |
압축 |
키 또는 값의 압축된 표현을 계산합니다. 색인이 생성됨 | 3 |
압축해제 |
압축된 키의 압축 해제된 표현을 계산 | 4 |
페널티 |
주어진 하위 트리에 새 키를 삽입하면 페널티를 계산합니다. 하위 트리의 키 | 5 |
picksplit |
페이지의 어떤 항목이 새 페이지로 이동될지 결정 페이지를 열고 결과 페이지에 대한 통합 키를 계산합니다. | 6 |
같음 |
두 개의 키를 비교하고 같으면 true를 반환합니다. | 7 |
거리 |
키에서 쿼리 값까지의 거리 결정(선택 사항) | 8 |
SP-GiST 인덱스에는 다음과 같이 5가지 지원 기능이 필요합니다.표 35-10. (자세한 내용은 다음을 참조하세요.스포츠 토토 : 문서 : 9.3 : SP-Gist Indexes.)
표 35-10. SP-GiST 지원 기능
| 기능 | 설명 | 지원 번호 |
|---|---|---|
구성 |
연산자 클래스에 대한 기본 정보 제공 | 1 |
선택 |
내부 튜플에 새 값을 삽입하는 방법 결정 | 2 |
picksplit |
값 세트를 분할하는 방법 결정 | 3 |
내부_일관성 |
어떤 하위 파티션을 검색해야 하는지 결정 쿼리 | 4 |
leaf_condependent |
키가 쿼리 한정자를 만족하는지 확인 | 5 |
GIN 인덱스에는 4가지 지원 기능이 필요하며, 선택 사항 다섯 번째, 다음과 같이표 35-11. (자세한 내용은 정보 참조토토 커뮤니티 : 문서 : 9.3 : 진 인덱스.)
표 35-11. GIN 지원 기능
| 기능 | 설명 | 지원 번호 |
|---|---|---|
비교 |
두 개의 키를 비교하여 0보다 작은 정수, 0 또는 0보다 큼, 첫 번째 키가 다음보다 작은지 여부를 나타냅니다. 두 번째와 같거나 크다 | 1 |
추출값 |
인덱싱할 값에서 키 추출 | 2 |
추출쿼리 |
쿼리 조건에서 키 추출 | 3 |
일관적인 |
값이 쿼리 조건과 일치하는지 확인 | 4 |
비교부분 |
쿼리의 부분 키와 인덱스의 키를 비교하고 반환 0보다 작은 정수, 0 또는 0보다 큰 정수를 나타냅니다. GIN이 이 색인 항목을 무시해야 하는지 여부는 해당 항목을 색인 스캔 일치 또는 중지(선택 사항) | 5 |
검색 연산자와 달리 지원 함수는 어떤 데이터든 반환합니다. 특정 인덱스 메소드가 예상하는 것을 입력하십시오. 예를 들어 이런 경우 B-트리에 대한 비교 함수, 부호 있는 정수. 는 각 지원 함수에 대한 인수의 수와 유형은 다음과 같습니다. 마찬가지로 인덱스 방법에 따라 다릅니다. B-트리 및 해시의 경우 비교 및 해싱 지원 기능은 동일한 입력 데이터를 사용합니다. 연산자 클래스에 포함된 연산자와 같은 유형이지만 이는 대부분의 GiST, SP-GiST 및 GIN 지원에는 해당되지 않습니다. 기능.
이제 우리는 아이디어를 보았으므로 여기에 약속된 예가 있습니다. 새로운 연산자 클래스를 생성합니다. (이것의 작업 복사본을 찾을 수 있습니다. 예src/tutorial/complex.c그리고src/tutorial/complex.sql소스에서 분포.) 연산자 클래스는 정렬하는 연산자를 캡슐화합니다. 절대값 순서의 복소수이므로 이름을 선택합니다.complex_abs_ops. 먼저, 세트가 필요합니다. 연산자. 연산자를 정의하는 절차는 다음에서 논의되었습니다.무지개 토토 : 문서 : 9.3 : 무지개 토토 정의 연산자. 연산자 클래스의 경우 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.
하지만포스트그레SQL대응할 수 있습니다 동일한 SQL 이름을 갖는 함수를 사용하는 경우 인수 데이터 유형이 다르면 C는 하나의 전역 변수에만 대처할 수 있습니다. 주어진 이름을 가진 함수. 따라서 C 함수의 이름을 지정해서는 안 됩니다. 다음과 같은 간단한 것abs_eq. 보통 C 언어에 데이터 유형 이름을 포함하는 것이 좋습니다. 다른 데이터에 대한 함수와 충돌하지 않도록 함수 이름 유형.
우리는 함수의 SQL 이름을 만들 수 있었습니다abs_eq, 의지함포스트그레SQL인수 데이터로 구별하기 위해 동일한 이름의 다른 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-트리 연산자 클래스의 경우 플래너 이후) 작업 방법에 대한 많은 지식이 포함되어 있습니다. 그들).
이러한 요구를 처리하려면,PostgreSQLan의 개념을 사용합니다연산자 계열. 연산자 제품군에는 다음 중 하나가 포함됩니다. 더 많은 연산자 클래스를 포함할 수 있으며 인덱싱 가능한 연산자와 가족에 속하는 해당 지원 기능 전체이지만 가족 내 단일 계층에는 해당되지 않습니다. 우리는 이렇게 말한다 그러한 연산자와 함수는 다음과 같습니다."느슨한"특정 클래스에 속박되는 것이 아니라 가족 내에서. 일반적으로 각 연산자 클래스에는 단일 데이터 유형 연산자가 포함됩니다. 교차 데이터 유형 연산자는 제품군에서 느슨합니다.
연산자 계열의 모든 연산자와 함수에는 다음이 있어야 합니다. 호환성 요구 사항이 설정되는 호환 의미론 인덱스 방식으로. 그러므로 왜 귀찮게 해야 하는지 궁금할 것입니다. 계열의 특정 하위 집합을 연산자 클래스로 선택합니다. 그리고 실제로 많은 목적을 위해 계급 구분은 부적절하며 가족은 유일하게 흥미로운 그룹입니다. 이유는 연산자 클래스를 정의하는 것은 그들이 특정 인덱스를 지원하려면 제품군이 필요합니다. 있는 경우 연산자 클래스를 사용하여 인덱스를 생성한 경우 해당 연산자 클래스는 인덱스를 삭제하지 않고 삭제되었지만 인덱스의 다른 부분은 연산자 계열, 즉 다른 연산자 클래스 및 느슨한 연산자, 떨어질 수 있습니다. 따라서 연산자 클래스는 다음과 같이 지정되어야 합니다. 최소한의 연산자와 함수 집합을 포함합니다. 특정 데이터 유형에 대한 인덱스 작업에 합리적으로 필요한 경우 그런 다음 관련되어 있지만 필수적이지 않은 연산자를 느슨하게 추가할 수 있습니다. 운영자 가족의 구성원입니다.
예를 들어,PostgreSQL이 있습니다 내장 B-트리 연산자 계열integer_ops, 연산자 클래스 포함int8_ops, int4_ops및int2_ops용 와이즈 토토bigint (int8), 정수 (int4) 및smallint (int2) 열입니다. 가족도 포함되어 있습니다. 교차 데이터 유형 비교 연산자는 다음 중 두 가지를 허용합니다. 이러한 유형 중 하나에 대한 인덱스를 비교할 수 있도록 유형을 비교할 수 있습니다. 다른 유형의 비교값을 사용하여 검색했습니다. 가족은 할 수 다음 정의와 중복됩니다.
btree를 사용하여 연산자 제품군 정수_ops 생성; 연산자 클래스 생성 int8_ops btree FAMILY 정수_ops AS를 사용하는 int8 유형의 기본값 -- 표준 int8 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint8cmp(int8, int8) , 기능 2 btint8sortsupport(내부) ; 연산자 클래스 생성 int4_ops btree FAMILY 정수_ops AS를 사용하는 int4 유형의 기본값 -- 표준 int4 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint4cmp(int4, int4) , 기능 2 btint4sortsupport(internal) ; 연산자 클래스 생성 int2_ops btree FAMILY 정수_ops AS를 사용하는 유형 int2의 기본값 -- 표준 int2 비교 연산자 1 < , 연산자 2 <= , 연산자 3 = , 연산자 4 = , 연산자 5 , 기능 1 btint2cmp(int2, int2) , 기능 2 btint2sortsupport(internal) ; 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) ;
이 정의에 주목하세요"오버로드"운영자 전략 및 지원 함수 번호: 각 숫자는 함수 내에서 여러 번 나타납니다. 가족. 이는 특정 인스턴스의 각 인스턴스가 허용되는 한 허용됩니다. 숫자에는 고유한 입력 데이터 유형이 있습니다. 둘 다 있는 인스턴스 연산자 클래스의 입력 유형과 동일한 입력 유형이 기본입니다. 해당 연산자 클래스에 대한 연산자 및 지원 함수 대부분의 경우는 연산자 클래스의 일부로 선언되어야 합니다. 느슨한 가족 구성원보다.
B-트리 연산자 계열에서 계열의 모든 연산자 호환 가능하게 정렬해야 합니다. 즉, 전이 법칙이 전체에 적용됩니다. 제품군에서 지원하는 모든 데이터 유형:"만일 A = B이고 B = C이면 A = C"및"A라면 < B 및 B < C, 그 다음에는 A < C". 게다가 암묵적이거나 연산자에 표시된 유형 간의 이진 강제 변환 family는 연관된 정렬 순서를 변경하면 안 됩니다. 각각에 대해 가족 내의 통신수에는 다음을 갖는 지원 기능이 있어야 합니다. 연산자와 동일한 두 가지 입력 데이터 유형입니다. 다음을 수행하는 것이 좋습니다. 즉, 각 데이터 유형 조합에 대해 모든 연산자가 포함됩니다. 각 연산자 클래스에는 비교차형 연산자 및 해당 데이터에 대한 지원 기능 유형.
다중 데이터 유형 해시 연산자 계열을 구축하려면 호환 가능 지원되는 각 데이터 유형에 대해 해시 지원 함수를 생성해야 합니다. 가족에 의해. 여기서 호환성이란 기능이 다음과 같다는 것을 의미합니다. 두 값에 대해 동일한 해시 코드를 반환하는 것이 보장됩니다. 가족의 평등 연산자에 의해 동등하다고 간주됩니다. 값의 유형은 다양합니다. 이는 일반적으로 어려운 일입니다 유형이 서로 다른 물리적 표현을 가질 때 수행됩니다. 그러나 어떤 경우에는 그렇게 할 수 있습니다. 또한, 연산자 계열로 표현되는 하나의 데이터 유형을 다른 데이터로 암시적 또는 연산자를 통해 연산자 계열로 표현되는 유형 이진 강제 변환은 계산된 해시 값을 변경해서는 안 됩니다. 데이터 유형별로 지원 함수가 하나만 있다는 점에 유의하세요. 항등 연산자당 하나씩. 가족이 함께하는 것이 좋습니다 완전합니다. 즉, 각 조합에 대해 동등 연산자를 제공합니다. 데이터 유형의 각 연산자 클래스에는 비교차형 항등 연산자 및 이에 대한 지원 함수 데이터 유형.
GiST, SP-GiST 및 GIN 인덱스에는 명시적인 개념이 없습니다. 교차 데이터 유형 작업. 지원되는 연산자 세트는 다음과 같습니다. 특정 운영자에 대한 주요 지원 기능이 무엇이든 간에 수업이 처리할 수 있습니다.
참고:이전포스트그레SQL8.3, 개념이 없었어요 연산자 계열 및 교차 데이터 유형 연산자 인덱스와 함께 사용하려면 인덱스에 직접 바인딩되어야 했습니다. 운영자 클래스. 이 접근 방식은 여전히 작동하지만 더 이상 사용되지 않습니다. 인덱스의 종속성이 너무 광범위해지기 때문입니다. 플래너는 교차 데이터 유형 비교를 보다 효과적으로 처리할 수 있습니다. 두 데이터 유형 모두 동일한 연산자에 연산자가 있는 경우 가족.
PostgreSQL연산자를 사용합니다 단순한 것 이상의 방법으로 연산자의 속성을 추론하는 클래스 인덱스와 함께 사용할 수 있는지 여부. 따라서 다음을 원할 수도 있습니다. 인덱싱할 의도가 없더라도 연산자 클래스를 생성하세요. 데이터 유형의 모든 열.
특히 다음과 같은 SQL 기능이 있습니다.주문 기준그리고독특그것 값의 비교와 정렬이 필요합니다. 이를 구현하려면 사용자 정의 데이터 유형에 대한 기능,PostgreSQL기본 B-트리를 찾습니다 데이터 유형에 대한 연산자 클래스입니다."같음"이 연산자 클래스의 구성원은 시스템의 가치 평등 개념그룹 으로그리고독특및 정렬 연산자 클래스에 의해 부과된 순서는 기본값을 정의합니다.주문 기준주문합니다.
사용자 정의 유형의 배열 비교는 또한 다음 사항에 의존합니다. 기본 B-트리 연산자 클래스에 의해 정의된 의미 체계입니다.
데이터 유형에 대한 기본 B-트리 연산자 클래스가 없는 경우, 시스템은 기본 해시 연산자 클래스를 찾습니다. 하지만 이후 그런 종류의 연산자 클래스는 동등성만 제공하지만 실제로는 배열 동등성을 지원하는 데만 충분합니다.
데이터 유형에 대한 기본 연산자 클래스가 없는 경우, 다음과 같은 오류가 발생합니다."식별할 수 없습니다 주문 연산자"이러한 SQL 기능을 다음과 함께 사용하려고 하면 데이터 유형입니다.
참고:에PostgreSQL7.4 이전 버전에서는 정렬 및 그룹화 작업이 암시적으로 이름이 지정된 연산자를 사용합니다.=, <및. 기본 연산자 클래스에 의존하는 새로운 동작은 운영자의 행동에 대해 가정을 해야 합니다. 특정 이름.
또 다른 중요한 점은 해시 연산자 계열은 해시 조인의 후보입니다. 집계 및 관련 최적화. 해시 연산자 계열은 다음과 같습니다. 사용할 해시 함수를 식별하므로 여기서는 필수적입니다.
일부 인덱스 액세스 방법(현재는 GiST만)은 다음을 지원합니다. 의 개념순서 연산자. 우리가 무엇을 지금까지 논의한 내용은 다음과 같습니다.검색 연산자. 검색 연산자는 색인이 될 수 있는 연산자입니다. 만족스러운 모든 행을 찾기 위해 검색했습니다.어디에서 indexed_column 연산자 상수. 약속된 것은 아무것도 없습니다. 일치하는 행이 반환되는 순서입니다. 대조적으로, 순서 연산자는 행 집합을 제한하지 않습니다. 반환되지만 대신 순서를 결정합니다. 주문 연산자 인덱스를 스캔하여 행을 반환할 수 있는 인덱스입니다. 순서는 다음과 같습니다.주문 기준 indexed_column 연산자 상수. 순서를 정의하는 이유 연산자는 가장 가까운 이웃 검색을 지원한다는 것입니다. 연산자가 거리를 측정하는 사람인 경우. 예를 들어 쿼리 좋아요
SELECT * FROM 장소 ORDER BY 위치 <- 포인트 '(101,456)' LIMIT 10;
주어진 목표 지점에 가장 가까운 10개의 장소를 찾습니다. GiST 위치 열의 와이즈 토토는 이 작업을 효율적으로 수행할 수 있습니다.<-순서 연산자입니다.
검색 연산자는 부울 결과를 반환해야 하지만, 연산자는 일반적으로 부동 소수점 또는 숫자와 같은 다른 유형을 반환합니다. 거리를 위해. 이 유형은 일반적으로 데이터 유형과 동일하지 않습니다. 색인화 중입니다. 행동에 대한 고정된 가정을 피하기 위해 다양한 데이터 유형의 순서 연산자의 정의는 다음과 같습니다. 정렬을 지정하는 B-트리 연산자 계열의 이름을 지정하는 데 필요합니다. 결과 데이터 유형의 순서. 이전에 언급했듯이 섹션, B-트리 연산자 계열 정의PostgreSQL의 순서 개념이므로 이는 자연스러운 표현. 시점부터<-연산자가 반환됨float8, 연산자 클래스에 지정할 수 있습니다. 생성 명령은 다음과 같습니다:
OPERATOR 15 <- (점, 점) FOR ORDER BY float_ops
어디에서float_ops내장되어 있습니다 다음 작업을 포함하는 연산자 계열float8. 이 선언은 인덱스가 다음을 수행할 수 있음을 나타냅니다. 값이 증가하는 순서대로 행을 반환하려면<-연산자.
우리가 가지고 있는 연산자 클래스에는 두 가지 특별한 기능이 있습니다 아직 논의되지 않았습니다. 주로 유용하지 않기 때문입니다. 일반적으로 사용되는 인덱스 방법입니다.
일반적으로 연산자를 연산자 클래스의 구성원으로 선언 (또는 계열)은 인덱스 방법이 정확하게 검색할 수 있음을 의미합니다. a를 만족하는 행 집합어디조건 연산자를 사용합니다. 예를 들면:
SELECT * FROM 테이블 WHERE 정수_열 < 4;
정수에 대한 B-트리 인덱스로 정확히 충족될 수 있습니다. 칼럼. 그러나 인덱스가 부정확한 정보로 유용한 경우가 있습니다. 일치하는 행을 안내합니다. 예를 들어, GiST 인덱스가 저장하는 경우 기하학적 객체에 대한 경계 상자만 있으면 정확하게 a를 만족시키다어디에서테스트 조건 다각형과 같은 직사각형이 아닌 객체 사이가 겹칩니다. 그래도 우리는 경계 상자가 개체와 겹치는 개체를 찾기 위해 인덱스를 사용할 수 있습니다. 대상 객체의 경계 상자를 선택한 다음 정확히 겹칩니다. 인덱스에서 찾은 개체에 대해서만 테스트하십시오. 이 시나리오라면 적용되며 인덱스는 다음과 같습니다."손실"운영자용. 손실이 있는 인덱스 검색은 다음을 통해 구현됩니다. 인덱스 메소드는 a를 반환합니다.다시 확인플래그 행이 실제로 쿼리 조건을 만족할 수도 있고 만족하지 않을 수도 있는 경우. 그런 다음 핵심 시스템은 원본 쿼리 조건을 테스트합니다. 유효한 것으로 반환되어야 하는지 확인하기 위해 검색된 행 일치합니다. 이 접근 방식은 인덱스가 모든 항목을 반환하도록 보장되는 경우 작동합니다. 필수 행과 추가 행이 있을 수 있습니다. 원래 연산자 호출을 수행하여 제거됩니다. 는 손실 검색을 지원하는 인덱스 방법(현재 GiST, SP-GiST 및 GIN) 개별 연산자 클래스의 지원 기능을 허용합니다. 재검사 플래그를 설정하는 것입니다. 따라서 이것은 본질적으로 연산자 클래스 기능.
색인에 저장하는 상황을 다시 생각해 보세요 다각형과 같은 복잡한 개체의 경계 상자만 해당됩니다. 에서 이 경우 전체 다각형을 저장하는 데 큰 가치가 없습니다. 인덱스 항목 — 우리는 단지 더 간단한 객체를 저장할 수도 있습니다. 유형상자. 이 상황은 다음과 같이 표현됩니다.저장옵션 포함연산자 클래스 생성: 뭔가를 작성하겠습니다 좋아요:
연산자 클래스 생성polygon_ops
gist AS를 사용하는 유형 다각형의 기본값
...
저장 상자;
현재 GiST 및 GIN 색인 방법만 다음을 지원합니다.저장다음과 다른 유형입니다.
열 데이터 유형. GiST압축그리고압축해제지원 루틴은 다음과 같아야 합니다.
다음과 같은 경우 데이터 유형 변환을 처리합니다.저장이 사용됩니다. GIN에서는저장type은 다음의 유형을 식별합니다."열쇠"값은 일반적으로
인덱싱된 열의 유형(예: 연산자 클래스)
정수 배열 열에는 정수인 키가 있을 수 있습니다. 는
진추출값그리고추출쿼리지원 루틴은 다음을 담당합니다.
색인화된 값에서 키를 추출합니다.
| 이전 | 배트맨 토토 : 문서 : 9.3 : 배트맨 토토 9.3.25 문서화 | 다음 |
| 운영자 최적화 정보 | Postgre토토 사이트 추천 : 문서 : 9.3 : 토토 사이트 추천 확장 | 포장 관련 확장에 대한 객체 |