SP-GiST공간 분할의 약어입니다GiST. SP-GiST쿼드 트리, k-d 트리 및 기수 트리(시도)와 같은 다양한 불균형 데이터 구조의 개발을 용이하게 하는 분할된 검색 트리를 지원합니다. 이러한 구조의 공통 특징은 검색 공간을 동일한 크기일 필요가 없는 파티션으로 반복적으로 분할한다는 것입니다. 분할 규칙과 잘 일치하는 검색은 매우 빠를 수 있습니다.
이러한 널리 사용되는 데이터 구조는 원래 메모리 내 사용을 위해 개발되었습니다. 주 메모리에서는 일반적으로 포인터로 연결된 동적으로 할당된 노드 집합으로 설계됩니다. 이러한 포인터 체인은 너무 길어서 너무 많은 디스크 액세스가 필요할 수 있으므로 디스크에 직접 저장하는 데 적합하지 않습니다. 대조적으로, 디스크 기반 데이터 구조는 I/O를 최소화하기 위해 높은 팬아웃을 가져야 합니다. 다음이 해결한 과제SP-GiST검색이 많은 노드를 통과하더라도 몇 개의 디스크 페이지에만 액세스하면 되는 방식으로 검색 트리 노드를 디스크 페이지에 매핑하는 것입니다.
좋아요GiST, SP-GiST은 데이터베이스 전문가가 아닌 데이터 유형 도메인의 전문가가 적절한 액세스 방법을 사용하여 사용자 정의 데이터 유형을 개발할 수 있도록 하기 위한 것입니다.
여기에 있는 일부 정보는 퍼듀 대학의 SP-GiST 색인 프로젝트에서 파생되었습니다.웹사이트.SP-GiST구현포스트그레SQL주로 Teodor Sigaev와 Oleg Bartunov가 관리하며 이들에 대한 자세한 정보가 있습니다.웹사이트.
핵심포스트그레SQL배포에는 다음이 포함됩니다SP-GiST다음에 표시된 연산자 클래스표 65.2.
표 65.2. 내장SP-GiST연산자 클래스
| 이름 | 인덱싱 가능한 연산자 | 순서 연산자 | 
|---|---|---|
box_ops | 
              << (상자,상자) | 
              <- (상자,점) | 
            
&< (상자,상자) | 
            ||
& (상자,상자) | 
            ||
 (상자,상자) | 
            ||
<@ (상자,상자) | 
            ||
@ (상자,상자) | 
            ||
~= (상자,상자) | 
            ||
&& (상자,상자) | 
            ||
<<| (상자,상자) | 
            ||
&<| (상자,상자) | 
            ||
|& (상자,상자) | 
            ||
| (상자,상자) | 
            ||
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 | 
              = (모든 범위,모든 범위) | 
              |
&&(모든 범위,모든 범위) | 
            ||
@ (모든 범위, 모든 요소) | 
            ||
@ (모든 범위,모든 범위) | 
            ||
<@ (모든 범위,모든 범위) | 
            ||
<< (모든 범위,모든 범위) | 
            ||
 (모든범위,모든범위) | 
            ||
&< (모든 범위,모든 범위) | 
            ||
& (모든 범위,모든 범위) | 
            ||
-|- (모든 범위,모든 범위) | 
            ||
text_ops | 
              = (텍스트,텍스트) | 
              |
< (텍스트,텍스트) | 
            ||
<= (텍스트,텍스트) | 
            ||
 (텍스트,텍스트) | 
            ||
= (텍스트,텍스트) | 
            ||
~<~ (텍스트,텍스트) | 
            ||
~<=~ (텍스트,텍스트) | 
            ||
~=~ (텍스트,텍스트) | 
            ||
~~ (텍스트,텍스트) | 
            ||
^@ (텍스트,텍스트) | 
            
유형에 대한 두 연산자 클래스 중점, quad_point_ops기본값입니다.kd_point_ops동일한 연산자를 지원하지만 일부 애플리케이션에서 더 나은 성능을 제공할 수 있는 다른 인덱스 데이터 구조를 사용합니다.
그quad_point_ops, kd_point_ops그리고poly_ops연산자 클래스는 다음을 지원합니다<-k-최근접 이웃을 활성화하는 순서 연산자(k-NN) 색인된 점 또는 다각형 데이터 세트를 검색합니다.
SP-GiST액세스 방법 개발자가 특정 데이터 유형에 특정한 방법만 구현하도록 요구하는 높은 수준의 추상화를 갖춘 인터페이스를 제공합니다.SP-GiSTcore는 효율적인 디스크 매핑과 트리 구조 검색을 담당합니다. 또한 동시성 및 로깅 고려 사항도 처리합니다.
an의 리프 토토 사이트 추천SP-GiST트리에는 일반적으로 색인된 열과 동일한 데이터 유형의 값이 포함되지만, 색인된 열의 손실 표현이 포함될 수도 있습니다. 루트 수준에 저장된 리프 튜플은 원래 인덱싱된 데이터 값을 직접 나타내지만 하위 수준의 리프 튜플에는 접미사와 같은 부분 값만 포함될 수 있습니다. 이 경우 연산자 클래스 지원 함수는 리프 수준에 도달하기 위해 전달되는 내부 튜플에서 축적된 정보를 사용하여 원래 값을 재구성할 수 있어야 합니다.
때SP-GiST색인은 다음을 사용하여 생성됩니다.포함열, 해당 열의 값은 리프 토토 사이트 추천에도 저장됩니다.포함열은 다음과 관련이 없습니다.SP-GiST연산자 클래스이므로 여기서는 더 이상 논의하지 않습니다.
내부 튜플은 검색 트리의 분기점이므로 더 복잡합니다. 각 내부 튜플에는 하나 이상의 집합이 포함됩니다.노드, 유사한 리프 값의 그룹을 나타냅니다. 노드에는 다른 하위 수준 내부 튜플 또는 모두 동일한 인덱스 페이지에 있는 짧은 리프 튜플 목록으로 연결되는 다운링크가 포함되어 있습니다. 각 노드에는 일반적으로라벨그것이 설명되어 있습니다; 예를 들어 기수 트리에서 노드 레이블은 문자열 값의 다음 문자일 수 있습니다. (또는 연산자 클래스가 모든 내부 튜플에 대해 고정된 노드 집합과 작동하는 경우 노드 레이블을 생략할 수 있습니다. 참조섹션 65.3.4.2.) 선택적으로 내부 튜플은 다음을 가질 수 있습니다.접두사모든 구성원을 설명하는 값입니다. 기수 트리에서 이는 표현된 문자열의 공통 접두사가 될 수 있습니다. 접두사 값은 실제로 접두사일 필요는 없지만 연산자 클래스에 필요한 모든 데이터일 수 있습니다. 예를 들어, 쿼드 트리에서는 4개의 사분면을 기준으로 측정되는 중심점을 저장할 수 있습니다. 그러면 쿼드 트리 내부 튜플에는 이 중심점 주변의 사분면에 해당하는 4개의 노드도 포함됩니다.
일부 트리 알고리즘은 현재 튜플의 수준(또는 깊이)에 대한 지식이 필요하므로SP-GiSTcore는 연산자 클래스가 트리를 내려가는 동안 레벨 계산을 관리할 수 있는 가능성을 제공합니다. 필요한 경우 표현된 값을 점진적으로 재구성하고 추가 데이터(라고 함)를 전달하는 기능도 지원됩니다.횡단 값) 나무 하강 중.
그SP-GiST핵심 코드는 null 항목을 처리합니다. 그래도SP-GiST인덱스는 인덱싱된 열에 null에 대한 항목을 저장합니다. 이는 인덱스 연산자 클래스 코드에서 숨겨집니다. null 인덱스 항목이나 검색 조건은 연산자 클래스 메서드에 전달되지 않습니다. (가정됩니다.SP-GiST연산자는 엄격하므로 null 값에 대해서는 성공할 수 없습니다.) 따라서 여기서는 null 값에 대해 더 이상 논의하지 않습니다.
색인 연산자 클래스에 대한 5개의 사용자 정의 메소드가 있습니다.SP-GiST반드시 제공해야 하며 2개는 선택사항입니다. 다섯 가지 필수 방법은 모두 두 가지를 허용하는 규칙을 따릅니다.내부인수 중 첫 번째 인수는 지원 메소드에 대한 입력 값을 포함하는 C 구조체에 대한 포인터이고, 두 번째 인수는 출력 값이 배치되어야 하는 C 구조체에 대한 포인터입니다. 필수 메소드 중 4개가 반환됩니다.공허, 모든 결과가 출력 구조체에 나타나기 때문입니다. 하지만잎_일관성a를 반환합니다.부울결과. 메서드는 입력 구조체의 어떤 필드도 수정해서는 안 됩니다. 모든 경우에 출력 구조체는 사용자 정의 메서드를 호출하기 전에 0으로 초기화됩니다. 선택적인 여섯 번째 방법압축수락데이텀유일한 인수로 인덱싱되며 리프 토토 사이트 추천의 물리적 저장에 적합한 값을 반환합니다. 선택적 일곱 번째 방법옵션수락내부opclass 특정 매개변수가 배치되어야 하는 C 구조체에 대한 포인터 및 반환무효.
5가지 필수 사용자 정의 방법은 다음과 같습니다.
구성접두사 및 노드 레이블 데이터 유형의 데이터 유형 OID를 포함하여 인덱스 구현에 대한 정적 정보를 반환합니다.
그SQL함수 선언은 다음과 같아야 합니다:
CREATE FUNCTION my_config(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgConfigIn함수에 대한 입력 데이터를 포함하는 C 구조체. 두 번째 인수는 a에 대한 포인터입니다.spgConfigOut함수가 결과 데이터로 채워야 하는 C 구조체.
typedef 구조체 spgConfigIn
    Oid attType;        /* 인덱싱할 데이터 유형 */
 spgConfigIn;
typedef 구조체 spgConfigOut
    Oid 접두사 유형;     /* 내부 튜플 접두사의 데이터 유형 */
    Oid labelType;      /* 내부 튜플 노드 레이블의 데이터 유형 */
    Oid leafType;       /* 리프-튜플 값의 데이터 유형 */
    bool canReturnData;  /* Opclass는 원본 데이터를 재구성할 수 있습니다 */
    bool longValuesOK;   /* Opclass는 1 페이지보다 큰 값에 대처할 수 있습니다 */
 spgConfigOut;
          attType28594_28767
접두어를 사용하지 않는 연산자 클래스의 경우,접두사 유형다음으로 설정 가능VOIDOID. 마찬가지로 노드 레이블을 사용하지 않는 연산자 클래스의 경우,라벨 유형다음으로 설정 가능VOIDOID. canReturnData연산자 클래스가 원래 제공된 인덱스 값을 재구성할 수 있는 경우 true로 설정되어야 합니다.longValuesOK다음 경우에만 true로 설정되어야 합니다.attType은 가변 길이이며 연산자 클래스는 반복되는 접미사를 통해 긴 값을 분할할 수 있습니다(참조섹션 65.3.4.1).
잎 유형연산자 클래스에 의해 정의된 색인 저장 유형과 일치해야 합니다.opckeytype카탈로그 항목. (참고하세요opckeytype는 0일 수 있으며 이는 저장 유형이 연산자 클래스의 입력 유형과 동일함을 의미하며 이는 가장 일반적인 상황입니다.) 이전 버전과의 호환성을 위해구성메서드를 설정할 수 있음잎 유형다른 값으로 변경하면 해당 값이 사용됩니다. 그러나 색인 내용이 카탈로그에서 잘못 식별되므로 이는 더 이상 사용되지 않습니다. 또한, 퇴실도 가능합니다잎 유형초기화되지 않음 (0); 이는 다음에서 파생된 인덱스 저장 유형을 의미하는 것으로 해석됩니다.opckeytype.
언제attType그리고잎 유형다름, 선택적 방법압축반드시 제공되어야 합니다. 방법압축인덱싱할 데이텀 변환을 담당합니다.attType에잎 유형.
선택내부 튜플에 새 값을 삽입하는 방법을 선택합니다.
그SQL함수 선언은 다음과 같아야 합니다:
함수 생성 my_choose(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgChooseIn함수에 대한 입력 데이터를 포함하는 C 구조체. 두 번째 인수는 a에 대한 포인터입니다.spgChooseOut함수가 결과 데이터로 채워야 하는 C 구조체.
typedef 구조체 spgChooseIn
    데이텀 데이텀;          /* 인덱싱할 원본 데이터 */
    데이텀 리프Datum;      /* 리프에 저장될 현재 데이터 */
    정수 수준;          /* 현재 레벨(0부터 계산) */
    /* 현재 내부 튜플의 데이터 */
    bool allTheSame;     /* 튜플은 모두 동일하게 표시됩니까? */
    bool hasPrefix;      /* 튜플에 접두사가 있나요? */
    데이텀 접두사Datum;    /* 그렇다면 접두사 값 */
    int nNodes;         /* 내부 튜플의 노드 수 */
    데이텀 *nodeLabels;     /* 노드 레이블 값(없으면 NULL) */
 spgChooseIn;
typedef 열거형 spgChooseResultType
    spgMatchNode = 1, /* 기존 노드로 내려갑니다 */
    spgAddNode, /* 내부 튜플에 노드 추가 */
    spgSplitTuple /* 내부 튜플 분할(접두사 변경) */
 spgChooseResultType;
typedef 구조체 spgChooseOut
    spgChooseResultType 결과 유형;     /* 액션 코드, 위 참조 */
    노동조합
        struct /* spgMatchNode에 대한 결과 */
            int nodeN;      /* 이 노드로 내려갑니다(인덱스 0부터) */
            int 레벨추가;   /* 이만큼 레벨을 증가시킵니다 */
            데이텀 레스트데이텀;  /* 새 잎 데이텀 */
         matchNode;
        struct /* spgAddNode에 대한 결과 */
            데이텀 nodeLabel;  /* 새 노드의 레이블 */
            int nodeN;      /* 삽입할 위치(인덱스는 0부터) */
         addNode;
        struct /* spgSplitTuple에 대한 결과 */
            /* 하나의 자식 튜플을 사용하여 새로운 상위 수준 내부 튜플을 형성하는 정보 */
            bool prefixHasPrefix;    /* 튜플에는 접두사가 있어야 합니까? */
            데이텀 접두사PrefixDatum;  /* 그렇다면 그 값 */
            int prefixNNodes;       /* 노드 수 */
            데이텀 *prefixNodeLabels;   /* 해당 레이블(또는 NULL
                                             * 라벨 없음) */
            int childNodeN;         /* 어떤 노드가 자식 튜플을 얻나요 */
            /* 모든 이전 노드로 새로운 하위 수준 내부 튜플을 형성하기 위한 정보 */
            bool postfixHasPrefix;   /* 튜플에는 접두사가 있어야 합니까? */
            데이텀 postfixPrefixDatum; /* 그렇다면 그 값 */
         분할튜플;
               결과;
 spgChooseOut;
          데이텀원래 데이텀은spgConfigIn.attType색인에 삽입될 유형입니다.leafDatum값은spgConfigOut.잎 유형처음에 메소드의 결과인 유형압축적용 대상데이텀언제 메소드압축제공되거나 동일한 값데이텀그렇지 않으면.leafDatum다음과 같은 경우 트리의 하위 수준에서 변경될 수 있습니다.선택또는picksplit메소드로 변경됩니다. 삽입 검색이 리프 페이지에 도달하면 현재 값은leafDatum새로 생성된 리프 토토 사이트 추천에 저장될 내용입니다.레벨은 루트 수준의 경우 0부터 시작하는 현재 내부 튜플의 수준입니다.allTheSame현재 내부 튜플이 여러 개의 동등한 노드를 포함하는 것으로 표시된 경우 true입니다(참조섹션 65.3.4.3). hasPrefix현재 내부 튜플에 접두사가 포함되어 있으면 true입니다. 그렇다면,prefixDatum그 값입니다.n노드은 내부 튜플에 포함된 하위 노드의 수이며노드 라벨은 라벨 값의 배열이거나 라벨이 없으면 NULL입니다.
그선택함수는 새 값이 기존 하위 노드 중 하나와 일치하는지, 새 하위 노드를 추가해야 하는지 또는 새 값이 튜플 접두사와 일치하지 않으므로 덜 제한적인 접두사를 생성하기 위해 내부 튜플을 분할해야 하는지 결정할 수 있습니다.
새 값이 기존 하위 노드 중 하나와 일치하면 설정결과유형에spgMatchNode. 설정노드N노드 배열에 있는 해당 노드의 인덱스(0부터)로. 설정레벨추가증분으로레벨해당 노드를 통해 내려감으로 인해 발생하며, 연산자 클래스가 레벨을 사용하지 않는 경우 0으로 둡니다. 설정restDatum동일하게leafDatum연산자 클래스가 한 수준에서 다음 수준으로 데이텀을 수정하지 않거나 그렇지 않으면 다음과 같이 사용할 수정된 값으로 설정하는 경우leafDatum다음 단계로.
새 하위 노드를 추가해야 하는 경우 설정결과유형에spgAddNode. 설정노드 라벨새 노드에 사용할 라벨에 설정노드N노드 배열에 노드를 삽입할 인덱스(0부터). 노드가 추가된 후,선택함수는 수정된 내부 튜플로 다시 호출됩니다; 해당 호출은spgMatchNode결과.
새 값이 튜플 접두사와 일치하지 않으면 설정결과유형에spgSplitTuple. 이 작업은 모든 기존 노드를 새로운 하위 수준 내부 튜플로 이동하고, 기존 내부 튜플을 새로운 하위 수준 내부 튜플을 가리키는 단일 다운링크가 있는 튜플로 대체합니다. 설정prefixHasPrefix새로운 상위 튜플에 접두사가 있어야 하는지 여부를 나타내고, 그렇다면 설정됩니다.prefixPrefixDatum접두사 값으로. 이 새 접두사 값은 인덱싱할 새 값을 허용할 수 있도록 원본보다 충분히 덜 제한적이어야 합니다. 설정prefixNNodes새 튜플에 필요한 노드 수로 설정prefixNodeLabels라벨을 보유한 palloc 배열로, 노드 라벨이 필요하지 않은 경우 NULL로. 새 상위 튜플의 전체 크기는 대체하는 튜플의 전체 크기보다 커서는 안 됩니다. 이는 새 접두사와 새 레이블의 길이를 제한합니다. 설정childNodeN새로운 하위 수준 내부 튜플로 다운링크할 노드의 인덱스(0부터). 설정postfixHasPrefix새로운 하위 수준 내부 튜플에 접두사가 있어야 하는지 여부를 나타내고, 그렇다면 설정됩니다.postfixPrefixDatum접두사 값으로. 이 두 접두사 및 다운링크 노드 레이블(있는 경우)의 조합은 원래 접두사와 동일한 의미를 가져야 합니다. 왜냐하면 새로운 하위 수준 튜플로 이동된 노드 레이블을 변경할 기회가 없거나 하위 인덱스 항목을 변경할 기회가 없기 때문입니다. 노드가 분할된 후,선택함수는 대체 내부 튜플로 다시 호출됩니다. 해당 호출은 다음을 반환할 수 있습니다.spgAddNode결과, 다음에 의해 적합한 노드가 생성되지 않은 경우spgSplitTuple행동. 결국선택반드시 반환해야 함spgMatchNode삽입이 다음 레벨로 내려갈 수 있도록 허용합니다.
picksplit리프 튜플 세트 위에 새로운 내부 튜플을 생성하는 방법을 결정합니다.
그SQL함수 선언은 다음과 같아야 합니다:
함수 생성 my_picksplit(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgPickSplitInC 구조체, 함수에 대한 입력 데이터가 포함되어 있습니다. 두 번째 인수는 a에 대한 포인터입니다.spgPickSplitOut함수가 결과 데이터로 채워야 하는 C 구조체.
typedef 구조체 spgPickSplitIn
    int nTuples;        /* 리프 튜플의 수 */
    데이텀 *데이텀;         /* 해당 데이텀(길이가 nTuples인 배열) */
    정수 수준;          /* 현재 레벨(0부터 계산) */
 spgPickSplitIn;
typedef 구조체 spgPickSplitOut
    bool hasPrefix;      /* 새로운 내부 튜플에는 접두사가 있어야 합니까? */
    데이텀 접두사Datum;    /* 그렇다면 그 값 */
    int nNodes;         /* 새로운 내부 튜플의 노드 수 */
    데이텀 *nodeLabels;     /* 해당 레이블(또는 레이블이 없는 경우 NULL) */
    int *mapTuplesToNodes;   /* 각 리프 튜플에 대한 노드 인덱스 */
    데이텀 *leafTupleDatums;    /* 각각의 새 리프 튜플에 저장할 데이터 */
 spgPickSplitOut;
          n토토 사이트 추천제공된 리프 토토 사이트 추천의 수입니다.데이텀는 해당 데이텀 값의 배열입니다.spgConfigOut.잎 유형유형.레벨은 모든 리프 튜플이 공유하는 현재 레벨이며, 이는 새로운 내부 튜플의 레벨이 됩니다.
설정hasPrefix새 내부 튜플에 접두사가 있어야 하는지 여부를 나타내고, 그렇다면 설정됩니다.prefixDatum접두사 값으로. 설정n노드새 내부 튜플에 포함될 노드 수를 나타내고 설정노드 라벨해당 레이블 값의 배열로 변환하거나 노드 레이블이 필요하지 않은 경우 NULL로 변환합니다. 설정mapTuplesToNodes각 리프 튜플이 할당되어야 하는 노드의 인덱스(0부터)를 제공하는 배열입니다. 설정leafTupleDatums새 리프 토토 사이트 추천에 저장될 값의 배열(이것은 입력과 동일합니다.데이텀연산자 클래스가 한 수준에서 다음 수준으로 데이텀을 수정하지 않는 경우). 참고하세요picksplit함수는 palloc'ing을 담당합니다.노드 라벨, mapTuplesToNodes그리고leafTupleDatums배열.
두 개 이상의 리프 튜플이 제공되면 다음이 예상됩니다.picksplit함수는 그것들을 하나 이상의 노드로 분류합니다; 그렇지 않으면 리프 튜플을 여러 페이지로 분할할 수 없습니다. 이것이 이 작업의 궁극적인 목적입니다. 그러므로 만일picksplit함수는 결국 모든 리프 튜플을 동일한 노드에 배치하게 되며, 핵심 SP-GiST 코드는 해당 결정을 무시하고 리프 튜플이 동일하게 레이블이 지정된 여러 노드에 무작위로 할당되는 내부 튜플을 생성합니다. 이러한 튜플은 표시됩니다.allTheSame이런 일이 발생했음을 나타냅니다.선택그리고내부_일관성함수는 이러한 내부 튜플에 대해 적절한 주의를 기울여야 합니다. 참조섹션 65.3.4.3더 많은 정보를 원하시면.
picksplit다음의 경우에만 단일 리프 튜플에 적용될 수 있습니다.구성기능 세트longValuesOKtrue로 설정되었으며 페이지보다 큰 입력 값이 제공되었습니다. 이 경우 작업의 요점은 접두사를 제거하고 새롭고 더 짧은 리프 데이텀 값을 생성하는 것입니다. 페이지에 맞을 만큼 짧은 리프 데이텀이 생성될 때까지 호출이 반복됩니다. 참조섹션 65.3.4.1자세한 정보는.
내부_일관성트리 검색 중에 따라갈 노드(가지) 세트를 반환합니다.
그SQL함수 선언은 다음과 같아야 합니다:
CREATE FUNCTION my_inner_contant(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgInnerCondependentIn함수에 대한 입력 데이터를 포함하는 C 구조체. 두 번째 인수는 a에 대한 포인터입니다.spgInnerCondependentOut함수가 결과 데이터로 채워야 하는 C 구조체.
typedef 구조체 spgInnerCondependentIn
    ScanKey 스캔키;       /* 연산자 및 비교 값의 배열 */
    ScanKey 주문;       /* 순서 연산자 배열 및 비교
                                 * 값 */
    int nkeys;          /* 스캔키 배열의 길이 */
    int norderbys;      /* orderby 배열의 길이 */
    재구성된 데이터값;     /* 부모에서 재구성된 값 */
    무효 *traversalValue; /* opclass별 트래버스 값 */
    MemoryContext traversalMemoryContext;   /* 여기에 새로운 트래버스 값을 입력하세요 */
    정수 수준;          /* 현재 레벨(0부터 계산) */
    bool returnData;     /* 원본 데이터를 반환해야 합니까? */
    /* 현재 내부 튜플의 데이터 */
    bool allTheSame;     /* 튜플은 모두 동일하게 표시됩니까? */
    bool hasPrefix;      /* 튜플에 접두사가 있나요? */
    데이텀 접두사Datum;    /* 그렇다면 접두사 값 */
    int nNodes;         /* 내부 튜플의 노드 수 */
    데이텀 *nodeLabels;     /* 노드 레이블 값(없으면 NULL) */
 spgInner일관성In;
typedef 구조체 spgInnerCondependentOut
    int nNodes;         /* 방문할 자식 노드 수 */
    int *nodeNumbers;    /* 노드 배열의 인덱스 */
    int *levelAdds;      /* 각각에 대해 이만큼 레벨을 증가시킵니다 */
    데이텀 *reconstructedValues;    /* 관련 재구성된 값 */
    무효 **traversalValues;        /* opclass별 트래버스 값 */
    이중 **거리;              /* 관련 거리 */
 spgInnerCondependentOut;
          배열스캔키, 길이n키, 인덱스 검색 조건을 설명합니다. 이러한 조건은 AND로 결합됩니다. 이 조건을 모두 만족하는 인덱스 항목만 관심 대상입니다. (참고하세요n키= 0은 모든 인덱스 항목이 쿼리를 충족함을 의미합니다.) 일반적으로 일관성 함수는 다음에만 관심이 있습니다.sk_strategy그리고sk_argument인덱싱 가능한 연산자와 비교 값을 각각 제공하는 각 배열 항목의 필드입니다. 특히 확인할 필요는 없습니다.sk_flags비교 값이 NULL인지 확인하려면 SP-GiST 핵심 코드가 이러한 조건을 필터링하기 때문입니다. 배열orderbys, 길이노더비, 동일한 방식으로 순서 연산자(있는 경우)를 설명합니다.reconstructedValue은 상위 튜플에 대해 재구성된 값입니다. 그것은(데이텀) 0루트 수준에서 또는 다음과 같은 경우내부_일관성함수는 상위 수준에서 값을 제공하지 않았습니다.traversalValue은 이전 호출에서 전달된 트래버스 데이터에 대한 포인터입니다.내부_일관성상위 인덱스 튜플 또는 루트 수준에서 NULL.traversalMemoryContext은 출력 트래버스 값을 저장할 메모리 컨텍스트입니다(아래 참조).레벨은 현재 내부 튜플의 수준이며 루트 수준의 경우 0부터 시작합니다.반환데이터is참이 쿼리에 재구성된 데이터가 필요한 경우; 이는 다음과 같은 경우에만 해당됩니다.구성함수 주장canReturnData. allTheSame현재 내부 튜플이 표시되면 true입니다.“모두 똑같습니다”; 이 경우 모든 노드는 동일한 레이블(있는 경우)을 가지므로 쿼리와 모두 일치하거나 전혀 일치하지 않습니다(참조)섹션 65.3.4.3). hasPrefix현재 내부 튜플에 접두사가 포함되어 있으면 참입니다. 그렇다면,prefixDatum그 값입니다.n노드은 내부 튜플에 포함된 하위 노드의 수이며노드 라벨는 해당 레이블 값의 배열이거나 노드에 레이블이 없는 경우 NULL입니다.
n노드검색으로 방문해야 하는 하위 노드 수로 설정되어야 하며노드번호인덱스 배열로 설정되어야 합니다. 연산자 클래스가 레벨을 추적하는 경우 setlevelAdds방문할 각 노드로 내려갈 때 필요한 레벨 증분 배열로. (종종 이러한 증분은 모든 노드에 대해 동일하지만 반드시 그런 것은 아니므로 배열이 사용됩니다.) 값 재구성이 필요한 경우 설정reconstructedValues방문할 각 하위 노드에 대해 재구성된 값의 배열로; 그렇지 않으면 떠나세요reconstructedValuesNULL로. 재구성된 값은 다음 유형으로 간주됩니다.spgConfigOut.잎 유형. (그러나 핵심 시스템은 복사하는 것 외에는 아무 작업도 수행하지 않으므로 동일한 기능을 갖는 것으로 충분합니다.타이플렌그리고typbyval속성잎 유형.) 순서 검색을 수행하는 경우 설정거리에 따른 거리 값 배열로orderbys배열(거리가 가장 낮은 노드가 먼저 처리됩니다). 그렇지 않으면 NULL로 두십시오. 추가적인 대역 외 정보를 전달하려는 경우(“횡단 값”) 트리 검색의 하위 수준으로 설정traversalValues방문할 각 하위 노드에 대해 하나씩 적절한 트래버스 값의 배열로; 그렇지 않으면 떠나세요traversalValuesNULL로. 참고하세요내부_일관성함수는 palloc'ing을 담당합니다.노드번호, levelAdds, 거리, reconstructedValues및traversalValues어레이는 현재 메모리 컨텍스트에 있습니다. 그러나 모든 출력 트래버스 값은traversalValues배열은 다음에 할당되어야 합니다.traversalMemoryContext. 각 트래버스 값은 단일 palloc 청크여야 합니다.
잎_일관성리프 토토 사이트 추천이 쿼리를 만족하면 참을 반환합니다.
그SQL함수 선언은 다음과 같아야 합니다:
CREATE FUNCTION my_leaf_contant(내부, 내부) RETURNS bool ...
첫 번째 인수는 a에 대한 포인터입니다.spgLeafCondependentIn함수에 대한 입력 데이터를 포함하는 C 구조체. 두 번째 인수는 a에 대한 포인터입니다.spgLeafCondependentOut함수가 결과 데이터로 채워야 하는 C 구조체.
typedef 구조체 spgLeafContantIn
    ScanKey 스캔키;       /* 연산자 및 비교 값의 배열 */
    ScanKey 주문;       /* 순서 연산자 배열 및 비교
                                 * 값 */
    int nkeys;          /* 스캔키 배열의 길이 */
    int norderbys;      /* orderby 배열의 길이 */
    재구성된 데이터값;     /* 부모에서 재구성된 값 */
    무효 *traversalValue; /* opclass별 트래버스 값 */
    정수 수준;          /* 현재 레벨(0부터 계산) */
    bool returnData;     /* 원본 데이터를 반환해야 합니까? */
    데이텀 리프Datum;      /* 리프 튜플의 데이터 */
 spgLeaf일관적In;
typedef 구조체 spgLeafCondependentOut
    데이텀 리프값;        /* 원본 데이터가 있으면 재구성 */
    부울 재확인;          /* 연산자를 다시 확인해야 하는 경우 true로 설정 */
    bool recheckDistances; /* 거리를 다시 확인해야 하는 경우 true로 설정 */
    이중 *거리;        /* 관련 거리 */
 spgLeafCondependentOut;
          배열스캔키, 길이n키, 인덱스 검색 조건을 설명합니다. 이러한 조건은 AND로 결합됩니다. 이 조건을 모두 만족하는 인덱스 항목만 쿼리를 만족시킵니다. (참고하세요n키= 0은 모든 인덱스 항목이 쿼리를 충족함을 의미합니다.) 일반적으로 일관성 함수는 다음에만 관심이 있습니다.sk_strategy그리고sk_argument인덱싱 가능한 연산자와 비교 값을 각각 제공하는 각 배열 항목의 필드입니다. 특히 확인할 필요는 없습니다.sk_flags비교 값이 NULL인지 확인하려면 SP-GiST 핵심 코드가 이러한 조건을 필터링하기 때문입니다. 배열orderbys, 길이노더비, 동일한 방식으로 정렬 연산자를 설명합니다.reconstructedValue은 상위 튜플에 대해 재구성된 값입니다. 그것은(데이텀) 0루트 수준에서 또는 다음과 같은 경우내부_일관성함수는 상위 수준에서 값을 제공하지 않았습니다.traversalValue이전 호출에서 전달된 트래버스 데이터에 대한 포인터입니다.내부_일관성상위 인덱스 튜플에, 또는 루트 수준에 NULL.레벨현재 리프 튜플의 레벨이며 루트 레벨의 경우 0부터 시작합니다.반환데이터is참이 쿼리에 재구성된 데이터가 필요한 경우; 이는 다음과 같은 경우에만 해당됩니다.구성함수 주장canReturnData. leafDatum다음의 키 값입니다.spgConfigOut.잎 유형현재 리프 튜플에 저장됩니다.
함수는 반드시 반환되어야 합니다.참리프 튜플이 쿼리와 일치하는 경우, 또는거짓그렇지 않다면. 에서참케이스, if반환데이터is참그런 다음잎값(유형의 값으로 설정되어야 함)spgConfigIn.attType)은 원래 이 리프 토토 사이트 추천에 대한 색인을 생성하기 위해 제공되었습니다. 또한,다시 확인다음으로 설정될 수 있음참일치 여부가 불확실하므로 연산자를 실제 힙 튜플에 다시 적용하여 일치 여부를 확인해야 하는 경우. 순서 검색을 수행하는 경우 설정거리다음에 따른 거리 값의 배열로orderbys배열. 그렇지 않으면 NULL로 두십시오. 반환된 거리 중 하나 이상이 정확하지 않은 경우 설정합니다.recheckDistances참입니다. 이 경우 실행자는 힙에서 튜플을 가져온 후 정확한 거리를 계산하고 필요한 경우 튜플을 다시 정렬합니다.
선택적인 사용자 정의 방법은 다음과 같습니다:
데이텀 압축(데이텀 입력)데이터 항목을 인덱스의 리프 토토 사이트 추천에 있는 물리적 저장에 적합한 형식으로 변환합니다. 유형의 값을 허용합니다.spgConfigIn.attType그리고 유형의 값을 반환합니다.spgConfigOut.잎 유형. 출력 값에는 라인 외부 TOAST 포인터가 포함되어서는 안 됩니다.
참고: the압축메소드는 저장할 값에만 적용됩니다. 일관된 메소드는 쿼리를 수신합니다.스캔키변경되지 않음, 변환을 사용하지 않음압축.
옵션연산자 클래스 동작을 제어하는 사용자가 볼 수 있는 매개변수 세트를 정의합니다.
그SQL함수 선언은 다음과 같아야 합니다:
함수 생성 또는 교체 my_options(내부) 반품 무효 AS 'MODULE_PATHNAME' 언어 C 엄격;
함수는 a에 대한 포인터를 전달받았습니다.local_reloptsstruct, 연산자 클래스별 옵션 세트로 채워져야 합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스할 수 있습니다.PG_HAS_OPCLASS_OPTIONS()그리고PG_GET_OPCLASS_OPTIONS()매크로.
키의 표현 이후SP-GiST유연하며 사용자가 지정한 매개변수에 따라 달라질 수 있습니다.
모든 SP-GiST 지원 방법은 일반적으로 단기 메모리 컨텍스트에서 호출됩니다. 즉,CurrentMemoryContext각 튜플 처리 후 재설정됩니다. 그러므로 palloc하는 모든 것을 해제하는 것에 대해 걱정하는 것은 그리 중요하지 않습니다. (그구성메서드는 예외입니다. 메모리 누수를 방지해야 합니다. 그러나 일반적으로구성메서드는 전달된 매개변수 구조체에 상수를 할당하는 것 외에는 아무것도 하지 않아도 됩니다.)
색인된 열이 대조 가능한 데이터 유형인 경우 색인 대조는 표준을 사용하여 모든 지원 방법에 전달됩니다.PG_GET_COLLATION()메커니즘.
이 섹션에서는 구현자에게 유용한 구현 세부정보 및 기타 트릭을 다룹니다.SP-GiST알아두어야 할 연산자 클래스.
개별 리프 튜플과 내부 튜플은 단일 인덱스 페이지에 맞아야 합니다(기본적으로 8kB). 따라서 가변 길이 데이터 형식의 값을 인덱싱할 때 긴 값은 트리의 각 수준에 페이지에 맞을 만큼 짧은 접두사가 포함되고 마지막 리프 수준에도 페이지에 들어갈 만큼 짧은 접미사가 포함되는 기수 트리와 같은 방법을 통해서만 지원될 수 있습니다. 연산자 클래스는 설정해야 합니다.longValuesOK이 일이 발생하도록 준비할 준비가 되어 있는 경우에만 true입니다. 그렇지 않으면,SP-GiST코어는 너무 커서 색인 페이지에 맞지 않는 값을 색인화하라는 요청을 거부합니다.
마찬가지로, 내부 튜플이 색인 페이지에 맞을 정도로 너무 커지지 않는 것은 연산자 클래스의 책임입니다. 이는 하나의 내부 튜플에서 사용할 수 있는 하위 노드의 수와 접두사 값의 최대 크기를 제한합니다.
또 다른 제한은 내부 튜플의 노드가 리프 튜플 세트를 가리킬 때 해당 튜플이 모두 동일한 인덱스 페이지에 있어야 한다는 것입니다. (이는 검색을 줄이고 이러한 튜플을 함께 연결하는 링크의 공간을 절약하기 위한 디자인 결정입니다.) 리프 튜플 세트가 페이지에 비해 너무 커지면 분할이 수행되고 중간 내부 튜플이 삽입됩니다. 문제를 해결하기 위해 새로운 내부 튜플반드시리프 값 세트를 둘 이상의 노드 그룹으로 나눕니다. 연산자 클래스의 경우picksplit함수가 이를 수행하지 못했습니다.SP-GiST핵심은 다음에 설명된 특별한 조치를 취함섹션 65.3.4.3.
언제longValuesOK맞습니다. 연속적인 수준의SP-GiST트리는 내부 튜플의 접두어와 노드 레이블에 점점 더 많은 정보를 흡수하여 필요한 리프 데이터를 점점 더 작게 만들어 결국 페이지에 맞도록 만듭니다. 연산자 클래스의 버그로 인해 무한 삽입 루프가 발생하는 것을 방지하려면SP-GiST리프 데이텀이 10주기 이내에 더 작아지지 않으면 코어는 오류를 발생시킵니다.선택메소드 호출.
일부 트리 알고리즘은 각 내부 튜플에 대해 고정된 노드 세트를 사용합니다. 예를 들어, 쿼드 트리에는 항상 내부 튜플의 중심점 주위의 4개 사분면에 해당하는 정확히 4개의 노드가 있습니다. 이러한 경우 코드는 일반적으로 번호별로 노드와 함께 작동하며 명시적인 노드 레이블이 필요하지 않습니다. 노드 레이블을 억제하여 공간을 절약하려면,picksplit함수는 다음에 대해 NULL을 반환할 수 있습니다.노드 라벨배열, 그리고 마찬가지로선택함수는 다음에 대해 NULL을 반환할 수 있습니다.prefixNodeLabelsa 동안 배열spgSplitTuple행동. 결과적으로 다음과 같은 결과가 발생합니다.노드 라벨다음 호출 중에 NULL임선택그리고내부_일관성. 원칙적으로 노드 레이블은 일부 내부 튜플에 사용되고 동일한 인덱스의 다른 튜플에는 생략될 수 있습니다.
레이블이 지정되지 않은 노드가 있는 내부 튜플로 작업할 때 오류가 발생합니다.선택돌아가다spgAddNode, 이러한 경우 노드 집합이 수정되어야 하기 때문입니다.
그SP-GiST코어는 연산자 클래스의 결과를 재정의할 수 있습니다.picksplit언제 기능을 수행picksplit제공된 리프 값을 최소한 두 개의 노드 범주로 나누는 데 실패합니다. 이런 일이 발생하면 각각 동일한 레이블(있는 경우)을 갖는 여러 노드로 새로운 내부 튜플이 생성됩니다.picksplit사용한 노드 하나에 부여되었으며 리프 값은 이러한 등가 노드 간에 무작위로 나뉩니다.allTheSame플래그는 내부 튜플에 설정되어 경고합니다.선택그리고내부_일관성튜플에 예상할 수 있는 노드 세트가 없는 함수입니다.
다음을 처리할 때allTheSame토토 사이트 추천, a선택결과spgMatchNode는 새 값이 동등한 노드에 할당될 수 있음을 의미하는 것으로 해석됩니다. 핵심 코드는 제공된 코드를 무시합니다노드N값을 설정하고 무작위로 노드 중 하나로 내려갑니다(트리의 균형을 유지하기 위해). 오류입니다.선택돌아오다spgAddNode, 그렇게 하면 노드가 모두 동일하지 않게 되기 때문입니다.spgSplitTuple삽입할 값이 기존 노드와 일치하지 않는 경우 작업을 사용해야 합니다.
다음을 처리할 때allTheSame토토 사이트 추천, 그내부_일관성함수는 모두 동일하므로 인덱스 검색을 계속하기 위한 대상으로 노드 전체를 반환하거나 전혀 반환하지 않아야 합니다. 여기에는 특수 사례 코드가 필요할 수도 있고 필요하지 않을 수도 있습니다.내부_일관성함수는 일반적으로 노드의 의미를 가정합니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.