SP-Gist우주 분수에 대한 약어gist. SP-Gist쿼드 트리, K-D 트리 및 래딕 트리와 같은 다양한 비 균형 잡힌 데이터 구조의 개발을 용이하게하는 파티션 된 검색 트리를 지원합니다. 이러한 구조의 일반적인 특징은 검색 공간을 크기가 동일 할 필요가없는 파티션으로 반복적으로 나누는 것입니다.
이 인기있는 데이터 구조는 원래 메모리 내 사용을 위해 개발되었습니다. 주 메모리에서는 일반적으로 포인터로 연결된 동적으로 할당 된 노드 세트로 설계됩니다.SP-Gist
Likegist, SP-Gist
여기의 일부 정보는 Purdue University의 SP-Gist Indexing Project에서 파생되었습니다웹 사이트. 그만큼SP-Gist구현PostgreSQL주로 Teodor Sigaev와 Oleg Bartunov에 의해 유지되며 그들의 자세한 정보가 있습니다.웹 사이트.
핵심PostgreSQL분포 포함SP-Gist운영자 클래스에 표시표 64.2.
표 64.2. 내장SP-Gist운영자 클래스
이름 | 롤 토토 가능한 연산자 | 주문 연산자 |
---|---|---|
box_ops |
<< (Box, Box) |
<-- (Box, Point) |
& <(Box, Box) |
||
& (Box, Box) |
||
(Box, Box) |
||
<@ (box, box) |
||
@ (Box, Box) |
||
~ = (Box, Box) |
||
&& (Box, Box) |
||
<< |
||
& < |
||
|
||
|
||
inet_ops |
<< (inet, inet) |
|
<< = (inet, inet) |
||
(inet, inet) |
||
= (inet, inet) |
||
= (inet, inet) |
||
< (inet, inet) |
||
<(inet, inet) |
||
<= (inet, inet) |
||
(inet, inet) |
||
= (inet, inet) |
||
&& (inet, inet) |
||
KD_Point_ops |
|
<-- (포인트, 포인트) |
<< (포인트, 포인트) |
||
(포인트, 포인트) |
||
<< |
||
~ = (포인트, 포인트) |
||
<@ (포인트, 박스) |
||
poly_ops |
<< (다각형, 다각형) |
<- (다각형, 포인트) |
& <(다각형, 다각형) |
||
& (다각형, 다각형) |
||
(다각형, 다각형) |
||
<@ (다각형, 다각형) |
||
@ (다각형, 다각형) |
||
~ = (다각형, 다각형) |
||
&& (다각형, 다각형) |
||
<< |
||
& < |
||
|
||
|
||
Quad_point_ops |
|
<-- (포인트, 포인트) |
<< (포인트, 포인트) |
||
(포인트, 포인트) |
||
<< |
||
~ = (포인트, 포인트) |
||
<@ (포인트, 박스) |
||
Range_ops |
= (AnyRange, AnyRange) |
|
&& (AnyRange, AnyRange) |
||
@ (AnyRange, Anylement) |
||
@ (AnyRange, AnyRange) |
||
<@ (AnyRange, AnyRange) |
||
<< (AnyRange, AnyRange) |
||
(AnyRange, AnyRange) |
||
& <(AnyRange, AnyRange) |
||
& (AnyRange, AnyRange) |
||
- |
||
text_ops |
= (텍스트, 텍스트) |
|
<(텍스트, 텍스트) |
||
<= (텍스트, 텍스트) |
||
(텍스트, 텍스트) |
||
= (텍스트, 텍스트) |
||
~ <~ (텍스트, 텍스트) |
||
~ <= ~ (텍스트, 텍스트) |
||
~ = ~ (텍스트, 텍스트) |
||
~ ~ (텍스트, 텍스트) |
||
^@ (텍스트, 텍스트) |
유형에 대한 두 연산자 클래스포인트
, Quad_point_ops
기본값입니다.KD_Point_ops
동일한 연산자를 지원하지만 일부 응용 프로그램에서 더 나은 성능을 제공 할 수있는 다른 인덱스 데이터 구조를 사용합니다.
theQuad_point_ops
, KD_Point_ops
andpoly_ops
운영자 클래스 지원<--
주문 연산자, K-Nearest Neighbor (를 가능하게합니다.K-NN
) 색인화 된 지점 또는 다각형 데이터 세트에 대한 검색.
SP-Gist높은 수준의 추상화와 인터페이스를 제공하므로 액세스 방법 개발자는 주어진 데이터 유형에 특정한 메소드 만 구현해야합니다. 그만큼SP-GistCore는 효율적인 디스크 매핑 및 트리 구조 검색을 담당합니다. 또한 동시성 및 로깅 고려 사항을 처리합니다.
leaf tuples of anSP-Gist트리는 일반적으로 롤 토토 된 열의 손실 표현을 포함 할 수도 있지만 일반적으로 롤 토토 된 열과 동일한 데이터 유형의 값을 포함합니다. 루트 레벨에 저장된 잎 튜플은 원래 롤 토토 데이터 값을 직접 나타내지 만, 낮은 레벨의 잎 튜플은 접미사와 같은 부분 값 만 포함 할 수 있습니다.
언제SP-Gist롤 토토가포함
열, 해당 열의 값은 잎 튜플에도 저장됩니다. 그만큼포함
열은 걱정할 필요가 없습니다SP-Gist운영자 클래스이므로 여기에서 더 자세히 설명하지 않습니다.
내부 튜플은 검색 트리의 분기 지점이기 때문에 더 복잡합니다. 각 내부 튜플에는 하나 이상의 세트가 포함됩니다노드, 유사한 잎 값의 그룹을 나타냅니다. 노드에는 다운 링크가 포함되어 있으며 다른 수준의 하단 내부 튜플 또는 동일한 인덱스 페이지에있는 짧은 잎 튜플 목록으로 연결됩니다.레이블예를 들어, Radix 트리에서 노드 레이블은 문자열 값의 다음 문자 일 수 있습니다.섹션 64.3.4.2.) 선택적으로, 내부 튜플은 a를 가질 수 있습니다.접두사모든 회원을 설명하는 값. radix 트리에서 이것은 표현 된 문자열의 일반적인 접두사 일 수 있습니다.
일부 트리 알고리즘은 현재 튜플의 레벨 (또는 깊이)에 대한 지식이 필요하므로SP-GistCore는 운영자 클래스가 트리를 내려 가면서 레벨 계산을 관리 할 가능성을 제공합니다. 필요할 때 대표 값을 점진적으로 재구성하고 추가 데이터를 전달하기위한 지원도 있습니다 (호출트래버스 값) 나무 하강 중.
theSP-Gist핵심 코드는 NULL 항목을 관리합니다. 하지만SP-Gist인덱스 인덱스 열에 nulls에 대한 저장 항목이 있습니다. 인덱스 운영자 클래스 코드에서 숨겨져 있습니다. 널 인덱스 항목 또는 검색 조건은 운영자 클래스 메소드에 전달되지 않습니다. (SP-Gist운영자는 엄격하고 널 값에 대해 성공할 수 없습니다.) 널 값은 여기에서 더 이상 논의되지 않습니다.
롤 토토 운영자가 클래스하는 5 가지 사용자 정의 방법이 있습니다SP-Gist제공해야하며 2 개는 선택 사항입니다. 다섯 가지 의무적 방법 모두 두 가지를 받아들이는 협약을 따릅니다내부
인수, 첫 번째는 지원 방법에 대한 입력 값을 포함하는 C 구조물에 대한 포인터이며, 두 번째 인수는 출력 값을 배치 해야하는 C 구조물에 대한 포인터입니다. 의무적 인 방법 중 네 가지가 반환void
, 모든 결과가 출력 구조물에 나타나기 때문에; 하지만Leaf_consistent
반환 a부울
결과. 방법은 입력 스트러크의 필드를 수정해서는 안됩니다.compress
수락 aDatum
유일한 인수로 인덱싱되고 리프 튜플에서 물리적 저장에 적합한 값을 반환합니다. 선택적 일곱 번째 방법옵션
수락내부
Opclass 별 매개 변수를 배치 해야하는 C 구조물에 대한 포인터 및 반환void
.
5 가지 필수 사용자 정의 방법은 다음과 같습니다.
config
접두사 및 노드 레이블 데이터 유형의 데이터 유형 OID를 포함하여 인덱스 구현에 대한 정적 정보를 반환합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 만들기 my_config (내부, 내부) 반환 void ...
첫 번째 인수는 A에 대한 포인터입니다SPGCONFIGIN
c 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.SPGCONFIGOUT
C 구조물, 함수가 결과 데이터로 채워야합니다.
typedef struct spgconfigin
atttype
;
접두사를 사용하지 않는 운영자 클래스의 경우PrefixType
voidoid
. 마찬가지로 노드 레이블을 사용하지 않는 운영자 클래스의 경우labelType
voidoid
. CanreturnData
운영자 클래스가 원래 보관 된 인덱스 값을 재구성 할 수있는 경우 true를 설정해야합니다.LongValuesok
만 맞아야합니다.atttype
길이가 변하고 연산자 클래스는 반복 된 접미사를 통해 긴 값을 분할 할 수 있습니다 (참조섹션 64.3.4.1).
LeafType
운영자 클래스에 의해 정의 된 인덱스 저장 유형과 일치해야합니다opckeyType
카탈로그 항목. (opckeyType
0이 될 수 있습니다. 스토리지 유형이 연산자 클래스의 입력 유형과 동일하다는 것을 암시합니다. 가장 일반적인 상황입니다.) 후진 호환성의 이유로config
메소드가 설정 될 수 있습니다LeafType
다른 값으로, 그 값이 사용될 것입니다. 그러나 이것은 롤 토토 내용이 카탈로그에서 잘못 식별되기 때문에 더 이상 사용되지 않습니다.LeafType
비 초기화 (0); 그것은에서 파생 된 롤 토토 스토리지 유형을 의미하는 것으로 해석됩니다.opckeyType
.
언제atttype
andLeafType
다른 방법compress
제공되어야합니다. 방법compress
atttype
toLeafType
.
선택
새 값을 내부 튜플에 삽입하는 방법을 선택합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 만들기 my_choose (내부, 내부) 반환 void ...
첫 번째 인수는 A에 대한 포인터입니다Spgchoosein
c 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.spgchooseout
C 구조물, 함수가 결과 데이터로 채워야합니다.
typedef struct spgchoosein
Datum
원래의 데이텀입니다.SPGCONFIGIN
.atttype
롤 토토에 삽입 될 유형.Leafdatum
SPGCONFIGOUT
.LeafType
유형은 처음에 메소드의 결과입니다compress
적용Datum
method.compress
제공됩니다.Datum
그렇지 않으면.Leafdatum
이면 트리의 낮은 수준에서 변경할 수 있습니다선택
또는picksplit
메소드 변경. 삽입 검색이 리프 페이지에 도달하면 현재 값Leafdatum
새로 생성 된 잎 튜플에 저장 될 것입니다.레벨
는 루트 레벨의 경우 0에서 시작하는 현재 튜플 레벨입니다.Allthesame
전류 내부 튜플이 여러 동등한 노드를 포함하는 것으로 표시된 경우 참조 (참조섹션 64.3.4.3). hasprefix
전류 내부 튜플에 접두사가 포함되어 있으면 참입니다. 그렇다면,PrefixDatum
값입니다.nnodes
내부 튜플에 포함 된 자식 노드의 수는Nodelabels
라벨이없는 경우 라벨 값의 배열이거나 널
the선택
함수는 새 값이 기존 자식 노드 중 하나와 일치하거나 새 하위 노드가 추가되어야한다는 것을 결정할 수 있거나 새 값이 튜플 접두사와 일치하지 않으므로 내부 튜플을 분할하여 덜 제한적인 접두사를 생성해야합니다..
새 값이 기존 자식 노드 중 하나와 일치하는 경우resulttype
toSPGMATCHNODE
. 세트Noden
노드 어레이의 해당 노드의 인덱스 (제로)까지. 세트levelAdd
증분으로레벨
해당 노드를 통해 내림차순으로 인해 발생하거나 연산자 클래스가 레벨을 사용하지 않으면 0으로 남겨 둡니다. 세트RestDatum
동등한Leafdatum
운영자 클래스가 한 레벨에서 다음 레벨로 데이트를 수정하지 않거나 다른 방법으로 사용할 수정 된 값으로 설정Leafdatum
다음 단계에서.
새 하위 노드를 추가 해야하는 경우resulttype
toSPGADDNODE
. 세트Nodelabel
새 노드에 사용될 레이블에Noden
노드 어레이에 노드를 삽입 할 인덱스 (0에서)로. 노드가 추가 된 후선택
함수는 수정 된 내부 튜플로 다시 호출됩니다. 그 전화는를 초래해야합니다.SPGMATCHNODE
결과.
새 값이 튜플 접두사와 일치하지 않는 경우resulttype
toSPGSPLITTUPLE
. 이 동작은 기존의 모든 노드를 새로운 하위 레벨 내부 튜플로 이동시키고 기존 내부 튜플을 새로운 하단 내부 튜플을 가리키는 단일 다운 링크를 갖는 튜플로 대체합니다.prefixhasprefix
새 튜플에 접두사가 있어야하는지 여부를 나타내려면prefixprefixDatum
접두사 값으로. 이 새로운 접두사 값은 색인화 할 새 값을 수락하기 위해 원본보다 충분히 덜 제한적이어야합니다.prefixnnodes
새 튜플에 필요한 노드 수로PrefixNodelabels
라벨을 보유한 Palloc'd 어레이에 또는 노드 라벨이 필요하지 않은 경우 NULL로. 새로운 상부 튜플의 총 크기는 교체하는 튜플의 총 크기에 지나지 않아야합니다.Childnoden
새로운 하위 레벨 내부 튜플로 다운 링크하는 노드의 인덱스 (0에서)로. 세트PostFixHaspRefix
새로운 하위 레벨 내부 튜플에 접두사가 있어야하는지 여부를 나타내려면postfixprefixdatum
접두사 값으로. 이 두 접두사와 다운 링크 노드의 레이블 (있는 경우)의 조합은 원래의 접두사와 동일한 의미를 가져야합니다. 원래의 접두사와 동일한 의미가 있어야합니다. 왜냐하면 새 하위 수준 튜플로 이동하는 노드 레이블을 변경하거나 하위 인덱스 항목을 변경할 수있는 기회가 없기 때문입니다.선택
함수는 교체 내부 튜플로 다시 호출됩니다. 그 전화는 반환 할 수 있습니다SPGADDNODE
결과, 적절한 노드가 생성되지 않은 경우SPGSPLITTUPLE
행동. 결국선택
반환해야합니다SPGMATCHNODE
삽입이 다음 단계로 내려 가도록합니다.
picksplit
잎 튜플 세트에 새로운 내부 튜플을 만드는 방법을 결정합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 만들기 my_picksplit (내부, 내부) 반환 void ...
첫 번째 인수는 A에 대한 포인터입니다SPGPICKSPLITIN
c 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.SPGPICKSPLITOUT
C 구조물, 함수가 결과 데이터로 채워야합니다.
typedef struct spgpicksplitin
ntuples
제공된 잎 튜플의 수입니다.Datums
SPGCONFIGOUT
.LeafType
타입.레벨
모든 잎 튜플이 공유하는 현재 레벨이며, 이는 새로운 내부 튜플의 수준이 될 것입니다.
SEThasprefix
새 내부 튜플에 접두사가 있어야하는지 여부를 나타내려면PrefixDatum
접두사 값으로. 세트nnodes
새 내부 튜플이 포함 할 노드 수를 나타내고 설정Nodelabels
라벨 값 배열 또는 노드 레이블이 필요하지 않은 경우 NULL로. 세트Maptuplestonodes
각 리프 튜플을 할당 해야하는 노드의 인덱스 (0에서)를 제공하는 배열로. 세트Leaftupledatums
새로운 잎 튜플에 저장 될 값의 배열로 (입력과 동일합니다Datums
운영자 클래스가 한 레벨에서 다음 레벨에서 다음 레벨로 데이 텀을 수정하지 않는 경우).picksplit
함수는 palloc'ing the에 책임이 있습니다.Nodelabels
, Maptuplestonodes
andLeaftupledatums
배열.
둘 이상의 잎 튜플이 제공되면picksplit
함수는 둘 이상의 노드로 분류됩니다. 그렇지 않으면 잎 튜플을 여러 페이지에 걸쳐 분할 할 수 없습니다. 이는이 작업의 궁극적 인 목적입니다.picksplit
함수는 모든 리프 튜플을 동일한 노드에 배치하게됩니다. 코어 SP-Gist 코드는 해당 결정을 무시하고 잎 튜플이 무작위로 동일한 여러 표지 된 노드에 지정되는 내부 튜플을 생성합니다. 그러한 튜플은 표시되어 있습니다Allthesame
이것이 일어났다는 것을 의미합니다. 그만큼선택
andInner_consistent
기능은 그러한 내부 튜플에 적합한주의를 기울여야합니다. 보다섹션 64.3.4.3자세한 내용은
picksplit
만으로만 단일 리프 튜플에 적용 할 수 있습니다.config
함수 세트LongValuesok
true로, PAT보다 큰 입력 값이 제공되었습니다. 이 경우 작업의 점은 접두사를 벗기고 새롭고 짧은 잎 기준 값을 생성하는 것입니다.섹션 64.3.4.1자세한 내용은
Inner_consistent
트리 검색 중에 따라야 할 노드 세트 (분기)를 반환합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 생성 my_inner_consistent (내부, 내부) 반환 void ...
첫 번째 인수는 A에 대한 포인터입니다SpginnerConsistentin
c 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.SpginnerConsistentOut
C 구조물, 함수가 결과 데이터로 채워야합니다.
typedef struct spginnerconsistentin
배열Scankeys
, 길이nkeys
, 롤 토토 검색 조건을 설명합니다. 이러한 조건은 결합되며 - 모든 것을 만족시키는 롤 토토 항목 만 흥미 롭습니다.nkeys
= 0은 모든 롤 토토 항목이 쿼리를 만족 시킨다는 것을 의미합니다.) 일반적으로 일관된 함수는에만 관심이 있습니다.sk_strategy
andsk_argument
각 배열 항목의 필드는 각각 색인 가능한 연산자와 비교 값을 제공합니다. 특히 확인할 필요가 없습니다sk_flags
SP-Gist 핵심 코드가 그러한 조건을 필터링하기 때문에 비교 값이 null인지 확인하려면. 배열Orderbys
, 길이Norderbys
, 주문 연산자 (있는 경우)를 같은 방식으로 설명합니다.재구성 value
부모 튜플에 대해 재구성 된 값입니다. 그것은(Datum) 0
루트 레벨에서 또는Inner_consistent
함수는 부모 수준에서 값을 제공하지 않았습니다.TraversalValue
이전 호출에서 전달 된 트래버스 데이터에 대한 포인터입니다.Inner_consistent
부모 색인 튜플에서 또는 루트 레벨의 널.TraversalMemoryContext
출력 트래버스 값을 저장하는 메모리 컨텍스트 (아래 참조).레벨
는 루트 레벨의 경우 0에서 시작하는 현재 튜플 레벨입니다.returnData
istrue
이 쿼리에 재구성 된 데이터가 필요한 경우; 이것은만큼 그렇게 될 것입니다config
기능 주장CanreturnData
. Allthesame
전류 내부 튜플이 표시되면 참입니다“All-the-Same”; 이 경우 모든 노드는 동일한 레이블 (있는 경우)을 가지므로 쿼리와 일치하거나 전혀 일치합니다 (참조섹션 64.3.4.3). hasprefix
전류 내부 튜플에 접두사가 포함되어 있으면 참입니다. 그렇다면,PrefixDatum
값입니다.nnodes
내부 튜플에 포함 된 자식 노드의 수는Nodelabels
노드에 레이블이없는 경우 레이블 값의 배열이거나 NULL입니다.
nnodes
검색에서 방문 해야하는 자식 노드 수로 설정해야합니다.Nodenumbers
인덱스 배열로 설정해야합니다. 운영자 클래스가 레벨을 추적하는 경우levelAdds
방문 할 각 노드로 내려갈 때 필요한 레벨 증분 배열로. (종종 이러한 증분은 모든 노드에서 동일하지만 반드시 그렇지는 않기 때문에 배열이 사용됩니다.) 값 재구성이 필요한 경우재구성
방문 할 각 어린이 노드에 대해 재구성 된 값의 배열; 그렇지 않으면 떠나재구성
null로. 재구성 된 값은 유형으로 가정됩니다SPGCONFIGOUT
.LeafType
. (그러나 핵심 시스템은 그것들을 복사 할 가능성을 제외하고는 그들과 아무것도하지 않을 것이기 때문에, 그들이 동일하게하기에 충분합니다.Typlen
andtypbyval
속성 asLeafType
.) 순서 검색이 수행되면 SET거리
에 따른 거리 값의 배열로Orderbys
배열 (먼 거리가 가장 낮은 노드가 먼저 처리됩니다). 그렇지 않으면 Null을 남겨 두십시오.“트래버스 값”) 트리 검색의 낮은 레벨에서 세트TraversalValues
적절한 트래버스 값의 배열로, 각 어린이 노드에 대해 하나는 방문 할; 그렇지 않으면 떠나TraversalValues
null로.Inner_consistent
함수는 palloc'ing the에 책임이 있습니다.Nodenumbers
, levelAdds
, 거리
, 재구성
및TraversalValues
현재 메모리 컨텍스트의 배열. 그러나, 출력 트래버스 값은TraversalValues
배열을 할당해야합니다TraversalMemoryContext
. 각 트래버스 값은 단일 palloc'd 청크 여야합니다.
Leaf_consistent
리프 튜플이 쿼리를 만족시키는 경우 true를 반환합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 생성 my_leaf_consistent (내부, 내부) 반환 bool ...
첫 번째 인수는 A에 대한 포인터입니다spleafconsistentin
c 함수에 대한 입력 데이터를 포함하는 구조. 두 번째 인수는 A에 대한 포인터입니다.spleafconsistentout
C 구조물, 함수가 결과 데이터로 채워야합니다.
typedef struct spleafconsistentin
배열Scankeys
, 길이nkeys
, 롤 토토 검색 조건을 설명합니다. 이러한 조건은 결합되며 - 모두를 만족시키는 롤 토토 항목 만 쿼리를 만족시킵니다.nkeys
= 0은 모든 롤 토토 항목이 쿼리를 만족 시킨다는 것을 의미합니다.) 일반적으로 일관된 함수는에만 관심이 있습니다.sk_strategy
andsk_argument
각 배열 항목의 필드는 각각 색인 가능한 연산자와 비교 값을 제공합니다. 특히 확인할 필요가 없습니다sk_flags
SP-Gist 핵심 코드가 그러한 조건을 필터링하기 때문에 비교 값이 null인지 확인하려면. 배열Orderbys
, 길이Norderbys
, 주문 연산자를 같은 방식으로 설명합니다.재구성 value
부모 튜플에 대해 재구성 된 값입니다. 그것은(Datum) 0
루트 레벨에서 또는Inner_consistent
함수는 부모 수준에서 값을 제공하지 않았습니다.TraversalValue
이전 호출에서 전달 된 트래버스 데이터에 대한 포인터입니다.Inner_consistent
부모 색인 튜플에서 또는 루트 레벨의 널.레벨
는 루트 레벨의 경우 0에서 시작하는 현재 잎 튜플 레벨입니다.returnData
istrue
이 쿼리에 재구성 된 데이터가 필요한 경우; 이것은만큼 그렇게 될 것입니다config
기능 주장CanreturnData
. Leafdatum
의 핵심 값입니다.SPGCONFIGOUT
.LeafType
현재 잎 튜플에 저장되었습니다.
함수가 반환해야합니다true
리프 튜플이 쿼리와 일치하는 경우false
그렇지 않은 경우. 에서true
case, ifreturnData
istrue
theLeafValue
(유형 값으로 설정해야합니다.SPGCONFIGIN
.atttype
) 원래이 잎 튜플에 대한 색인으로 제공되었습니다. 또한,다시 확인
로 설정 될 수 있습니다true
일치가 불확실하고 연산자가 실제 힙 튜플에 다시 적용되어 일치를 확인해야합니다. 주문한 검색이 수행되면 SET거리
에 따른 거리 값의 배열로Orderbys
배열. 그렇지 않으면 Null을 남겨 두십시오.RecheckDistances
true. 이 경우, executor는 튜플을 힙에서 가져온 후 정확한 거리를 계산하고 필요한 경우 튜플을 재정렬합니다..
선택적 사용자 정의 메소드는 다음과 같습니다.
Datum Compress (Datum in)
데이터 항목을 롤 토토의 리프 튜플에서 물리적 저장에 적합한 형식으로 변환합니다. 유형의 값을 받아들입니다SPGCONFIGIN
.atttype
유형 값을 반환SPGCONFIGOUT
.LeafType
. 출력 값에는 외부의 토스트 포인터가 포함되어서는 안됩니다.
참고 :compress
메소드는 저장할 값에만 적용됩니다. 일관된 방법은 쿼리를받습니다Scankeys
변환없이 변경되지 않았습니다compress
.
옵션
운영자 클래스 동작을 제어하는 사용자가 가시 가능한 매개 변수 세트를 정의합니다.
theSQL함수 선언은 다음과 같아야합니다.
함수 생성 또는 교체 my_options (내부)void를 반환합니다
함수가 A로 포인터가 전달됩니다local_relopts
STRUCT는 일련의 운영자 클래스 특정 옵션으로 채워야합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스 할 수 있습니다.pg_has_opclass_options ()
andpg_get_opclass_options ()
매크로
키를 표현한 이후SP-Gist융통성이 있으며 사용자 지정 매개 변수에 따라 다를 수 있습니다.
모든 SP-Gist 지원 방법은 일반적으로 단기간 메모리 컨텍스트에서 호출됩니다. 즉,CurrentMemoryContext
각 튜플을 처리 한 후 재설정됩니다. 그러므로 당신이 palloc의 모든 것을 pfree에 대해 걱정하는 것은 그리 중요하지 않습니다.config
메소드는 예외입니다. 메모리 누출을 피하려고 노력해야합니다. 그러나 보통config
메소드는 전달 된 매개 변수 구조물에 상수를 할당하는 것 외에는 아무것도 할 필요가 없습니다.)
인덱스 된 열이 Collatable 데이터 유형 인 경우 표준을 사용하여 모든 지원 메소드로 인덱스 콜레이션이 전달됩니다.pg_get_collation ()
메커니즘.
이 섹션은 구현 세부 사항 및 구현 자에게 유용한 기타 트릭을 다룹니다SP-Gist알아볼 운영자 클래스.
개별 잎 튜플과 내부 튜플은 단일 색인 페이지 (기본적으로 8kb)에 맞아야합니다. 따라서 가변 길이의 데이터 유형의 인덱싱 값을 인덱싱 할 때, 긴 값은 Radix Trees와 같은 방법에 의해서만 지원 될 수 있으며, 여기에는 트리의 각 레벨에는 페이지에 맞을 정도로 짧은 접두사가 포함되며 최종 잎 수준에는 페이지에 맞을 정도로 짧은 접미사가 포함됩니다.LongValuesok
이 일이 일어나도록 준비된 경우에만 true. 그렇지 않으면SP-GistCore는 색인 페이지에 너무 큰 값을 색인하라는 요청을 거부합니다.
마찬가지로, 내부 튜플이 인덱스 페이지에 맞지 않기에는 내부 튜플이 너무 커지지 않는 것이 운영자 클래스의 책임입니다. 이것은 하나의 내부 튜플에서 사용할 수있는 자식 노드의 수와 접두사 값의 최대 크기를 제한합니다.
또 다른 한계는 내부 튜플의 노드가 잎 튜플 세트를 가리킬 때 튜플이 모두 같은 색인 페이지에 있어야한다는 것입니다. (이것은 그러한 튜플을 묶는 링크의 탐색을 줄이고 공간을 절약하기위한 설계 결정입니다.) 잎 튜플 세트가 페이지에 비해 너무 커지면 분할이 수행되고 중간 내부 튜플이 삽입됩니다.필수잎 값 세트를 하나 이상의 노드 그룹으로 나눕니다. 운영자 클래스의 경우picksplit
함수는 그렇게하지 못합니다.SP-Gist코어 리조트에 설명 된 특별한 조치에 대한 리조트섹션 64.3.4.3.
언제LongValuesok
사실,의 연속적인 수준이 예상됩니다.SP-Gist트리는 내부 튜플의 접두사 및 노드 레이블에 점점 더 많은 정보를 흡수하여 필요한 잎 기준을 작고 작게 만들어 결국 페이지에 맞도록합니다. 운영자 클래스의 버그가 무한 삽입 루프를 유발하지 않도록SP-Gist잎 기준이 10 사이클 이내에 더 작아지지 않으면 코어가 오류가 발생합니다선택
메소드 호출.
일부 트리 알고리즘은 각 내부 튜플에 대해 고정 된 노드 세트를 사용합니다. 예를 들어, 쿼드 트리에는 항상 내부 튜플의 중심 지점 주위의 4 개의 사분면에 해당하는 정확히 4 개의 노드가 있습니다.picksplit
함수는 null을 반환 할 수 있습니다Nodelabels
배열 및 마찬가지로선택
함수는 null을 반환 할 수 있습니다PrefixNodelabels
A 중 배열SPGSPLITTUPLE
행동. 결과적으로Nodelabels
후속 호출 중선택
andInner_consistent
. 원칙적으로 노드 레이블은 일부 내부 튜플에 사용되어 같은 색인의 다른 튜플에 생략 할 수 있습니다.
표지되지 않은 노드를 가진 내부 튜플로 작업 할 때는에 대한 오류입니다.선택
반환SPGADDNODE
, 그러한 경우 노드 세트가 고정되어야하므로
theSP-Gist코어는 운영자 클래스의 결과를 무시할 수 있습니다picksplit
picksplit
제공된 잎 값을 두 개의 노드 범주로 나누지 못합니다. 이런 일이 발생하면 새 내부 튜플은 각각 동일한 레이블 (있는 경우)을 갖는 여러 노드로 생성됩니다.picksplit
사용했던 하나의 노드에 주어졌으며 잎 값은 이러한 동등한 노드 중에서 무작위로 나뉩니다. 그만큼Allthesame
플래그는 내부 튜플에 설정되어선택
andInner_consistent
튜플에 다른 방법으로 기대할 수있는 노드 세트가없는 함수.
대처할 때Allthesame
튜플, a선택
결과SPGMATCHNODE
새 값이 동등한 노드에 할당 될 수 있음을 의미하는 것으로 해석됩니다. 핵심 코드는 제공된 것을 무시합니다Noden
값을 무작위로 노드 중 하나로 내려갑니다 (나무의 균형을 유지하기 위해). 에 대한 오류입니다.선택
반환SPGADDNODE
, 그로 인해 노드가 모두 동일하지 않기 때문입니다. 그만큼SPGSPLITTUPLE
삽입 할 값이 기존 노드와 일치하지 않으면 조치를 사용해야합니다.
대처할 때Allthesame
튜플,Inner_consistent
함수는 모두 동등하기 때문에 인덱스 검색을 계속하기위한 대상으로 노드 또는 전부를 반환해야합니다. 이것은 얼마나 많은지에 따라 특수 사례 코드를 요구할 수도 있고 필요하지 않을 수 있습니다.Inner_consistent
함수는 일반적으로 노드의 의미에 대해 가정합니다.
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다.이 양식문서 문제를보고하려면