| PostgreSQL 9.2.24 문서 | ||||
|---|---|---|---|---|
| 토토 커뮤니티 : 문서 : 9.2 : 소개 | 위로 | 54장. SP-GiST 지수 | 토토 캔 : 문서 : 9.2 : 구현 | |
SP-GiST인터페이스 제공 높은 수준의 추상화로 인해 액세스 방법이 필요함 개발자는 주어진 데이터에 특정한 메소드만 구현합니다. 유형.SP-GiST핵심은 효율적인 디스크 매핑 및 트리 검색을 담당합니다. 구조. 또한 동시성과 로깅도 관리합니다. 고려 사항.
an의 리프 윈 토토SP-GiST트리에는 색인화된 열과 동일한 데이터 유형의 값이 포함되어 있습니다. 루트 수준의 리프 튜플에는 항상 원본이 포함됩니다. 인덱스된 데이터 값이지만 더 낮은 수준의 리프 튜플에는 다음이 포함될 수 있습니다. 접미사와 같은 압축된 표현만 가능합니다. 그런 경우에는 연산자 클래스 지원 함수는 재구성할 수 있어야 합니다. 내부에서 축적된 정보를 이용하여 원래의 값을 리프 수준에 도달하기 위해 전달되는 튜플입니다.
내부 튜플은 분기점이므로 더 복잡합니다. 검색 트리에서 각 내부 튜플에는 다음 중 하나 또는 더 많은노드는 다음의 그룹을 나타냅니다. 비슷한 잎 값. 노드에는 다음으로 연결되는 다운링크가 포함되어 있습니다. 또 다른 하위 수준 내부 튜플 또는 리프의 짧은 목록 모두 동일한 인덱스 페이지에 있는 튜플입니다. 각 노드에는레이블그것이 설명되어 있습니다; 예를 들어 접미사 트리 노드 레이블은 트리의 다음 문자가 될 수 있습니다. 문자열 값. 선택적으로 내부 튜플은 다음을 가질 수 있습니다.접두사모든 구성원을 설명하는 값입니다. 에서 접미사 트리 이것은 표현된 것의 공통 접두사가 될 수 있습니다. 문자열. 접두사 값은 실제로 접두사일 필요는 없지만 연산자 클래스에 필요한 모든 데이터가 될 수 있습니다. 예를 들어, 쿼드 트리(quad-tree)는 4개의 사분면이 있는 중심점을 저장할 수 있습니다. 에 대하여 측정됩니다. 쿼드 트리 내부 튜플은 다음과 같습니다. 또한 주변의 사분면에 해당하는 4개의 노드를 포함합니다. 이 중심점.
일부 트리 알고리즘에는 다음의 수준(또는 깊이)에 대한 지식이 필요합니다. 현재 튜플이므로SP-GiST코어는 다음에 대한 가능성을 제공합니다. 하강하는 동안 레벨 계산을 관리하는 연산자 클래스 나무. 점진적인 재구성도 지원됩니다. 필요할 때 표현된 값입니다.
참고:그SP-GiST핵심 코드는 null을 처리합니다. 항목. 그래도SP-GiST인덱스는 인덱싱된 열에 null에 대한 항목을 저장합니다. 인덱스 연산자 클래스 코드에서 숨겨져 있습니다. null 인덱스가 없습니다. 항목이나 검색 조건은 연산자 클래스 메소드. (가정됩니다.SP-GiST연산자는 엄격하므로 Null 값에 대해서는 성공할 수 없습니다.) 따라서 Null 값은 여기서는 더 이상 논의하지 않습니다.
색인 연산자가 수행하는 5개의 사용자 정의 메소드가 있습니다.
수업은SP-GiST반드시
제공합니다. 5개 모두 2개를 허용하는 규칙을 따릅니다.내부인수 중 첫 번째는
지원에 대한 입력 값을 포함하는 C 구조체에 대한 포인터
두 번째 인수는 C 구조체에 대한 포인터입니다.
출력 값이 배치되어야 하는 위치입니다. 네 가지 방법은 바로
반환공허, 모든 결과가 표시되므로
출력 구조체에서; 하지만잎_일관성추가로 a를 반환합니다.부울결과. 메서드를 수정하면 안 됩니다.
입력 구조체의 모든 필드. 모든 경우에 출력은
사용자 정의를 호출하기 전에 구조체가 0으로 초기화됩니다.
방법.
다섯 가지 사용자 정의 방법은 다음과 같습니다:
구성색인에 대한 정적 정보를 반환합니다. 접두사의 데이터 유형 OID를 포함한 구현 및 노드 라벨 데이터 유형입니다.
그SQL선언 함수는 다음과 같아야 합니다:
CREATE FUNCTION my_config(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgConfigIn입력을 포함하는 C 구조체 기능에 대한 데이터입니다. 두 번째 인수는 다음을 가리키는 포인터입니다. 에spgConfigOutC 구조체, 이는 함수는 결과 데이터로 채워야 합니다.
typedef 구조체 spgConfigIn
Oid attType; /* 인덱싱할 데이터 유형 */
spgConfigIn;
typedef 구조체 spgConfigOut
Oid 접두사 유형; /* 내부 튜플 접두사의 데이터 유형 */
Oid labelType; /* 내부 튜플 노드 레이블의 데이터 유형 */
bool canReturnData; /* Opclass는 원본 데이터를 재구성할 수 있습니다 */
bool lo윈 토토ValuesOK; /* Opclass는 1 페이지보다 큰 값에 대처할 수 있습니다 */
spgConfigOut;
attType순서대로 전달됩니다 다형성 인덱스 연산자 클래스를 지원합니다. 보통의 경우 고정 데이터 유형 연산자 클래스에는 항상 동일한 값이므로 무시할 수 있습니다.
접두사를 사용하지 않는 연산자 클래스의 경우,접두사 유형다음으로 설정 가능VOIDOID. 마찬가지로 운영자의 경우 노드 라벨을 사용하지 않는 클래스라벨 유형다음으로 설정 가능VOIDOID. canReturnData다음의 경우 true로 설정되어야 합니다. 연산자 클래스는 재구성할 수 있습니다. 원래 제공된 인덱스 값입니다.lo윈 토토ValuesOK참으로만 설정되어야 합니다 때attType다음 중 가변 길이와 연산자 클래스는 다음을 수행할 수 있습니다. 반복되는 접미사를 사용하여 긴 값을 분할합니다(참조섹션 54.3.1).
선택내부에 새 값을 삽입하는 방법을 선택합니다. 튜플.
그SQL선언 함수는 다음과 같아야 합니다:
함수 생성 my_choose(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgChooseIn입력을 포함하는 C 구조체 기능에 대한 데이터입니다. 두 번째 인수는 다음을 가리키는 포인터입니다. 에spgChooseOutC 구조체, 이는 함수는 결과 데이터로 채워야 합니다.
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; /* 그렇다면 그 값 */
데이텀 nodeLabel; /* 노드의 라벨 */
/* 모든 이전 노드로 새로운 하위 수준 내부 튜플을 형성하기 위한 정보 */
bool postfixHasPrefix; /* 튜플에는 접두사가 있어야 합니까? */
데이텀 postfixPrefixDatum; /* 그렇다면 그 값 */
분할튜플;
결과;
spgChooseOut;
데이텀원래 데이텀입니다
색인에 삽입될 예정이었습니다.leafDatum처음에는 다음과 같습니다데이텀, 그러나 더 낮은 수준에서는 변경될 수 있습니다.
다음과 같은 경우 트리의 수준선택또는picksplit메소드로 변경됩니다. 때
삽입 검색이 리프 페이지에 도달하면 현재 값은leafDatum무엇이 될 것인가
새로 생성된 리프 윈 토토에 저장됩니다.레벨현재 내부 튜플의 것입니다.
레벨, 루트 레벨의 경우 0부터 시작합니다.allTheSame현재 내부
튜플은 여러 개의 동등한 노드를 포함하는 것으로 표시됩니다.
(참조섹션
54.3.3). hasPrefix사실입니다
현재 내부 튜플에 접두사가 포함된 경우; 그렇다면,prefixDatum그 값입니다.n노드자녀 수입니다.
내부 튜플에 포함된 노드 및노드 라벨는 라벨의 배열입니다.
값이거나 라벨이 없으면 NULL입니다.
그선택함수는
새 값이 다음 중 하나와 일치하는지 확인합니다.
기존 하위 노드 또는 새 하위 노드가 있어야 함
추가되었거나 새 값이 튜플과 일치하지 않습니다.
접두사이므로 내부 튜플을 분할하여 생성해야 합니다.
덜 제한적인 접두사.
새 값이 기존 하위 항목 중 하나와 일치하는 경우 노드, 설정결과유형에spgMatchNode. 설정노드N그 인덱스(0부터)로 노드 배열의 노드. 설정레벨추가증분으로레벨그것을 통해 하강함으로써 발생 노드, 또는 연산자 클래스가 그렇지 않은 경우 0으로 두십시오. 수준을 사용합니다. 설정restDatum에 같음데이텀연산자가 클래스는 한 수준에서 다음 수준으로 데이텀을 수정하지 않습니다. 그렇지 않으면 다음과 같이 사용할 수정된 값으로 설정하십시오.leafDatum다음에 수준.
새 하위 노드를 추가해야 하는 경우 설정결과유형에spgAddNode. 설정노드 라벨사용할 라벨에
새 노드 및 설정노드N에
노드를 삽입할 인덱스(0부터)
노드 배열. 노드가 추가된 후,선택함수는 다음과 같이 다시 호출됩니다.
수정된 내부 튜플 해당 호출은spgMatchNode결과.
새 값이 튜플 접두사와 일치하지 않는 경우,
설정결과유형에spgSplitTuple. 이 작업으로 모든 항목이 이동됩니다.
기존 노드를 새로운 하위 수준 내부 튜플로
기존 내부 튜플을 다음을 갖는 튜플로 대체합니다.
새로운 하위 수준 내부 튜플에 연결되는 단일 노드입니다.
설정prefixHasPrefix에
새로운 상위 튜플에 접두사가 있어야 하는지 여부를 나타냅니다.
그리고 그렇게 설정된 경우prefixPrefixDatum접두사 값으로.
이 새로운 접두사 값은 충분히 덜 제한적이어야 합니다.
인덱싱할 새 값을 받아들이려면 원본보다
원래 접두사보다 길어서는 안 됩니다. 설정노드 라벨레이블에
새로운 하위 레벨을 가리키는 노드에 사용됩니다.
내부 튜플. 설정postfixHasPrefix다음 여부를 나타냅니다.
새로운 하위 수준 내부 튜플에는 접두사가 있어야 하며, 그렇다면
설정postfixPrefixDatum에
접두사 값. 이 두 접두사와
추가 라벨은 원본과 동일한 의미를 가져야 합니다.
접두사(노드를 변경할 기회가 없기 때문에)
새로운 하위 레벨 튜플로 이동된 라벨
하위 인덱스 항목을 변경합니다. 노드가 생성된 후
분할,선택함수
대체 내부 튜플로 다시 호출됩니다. 그
호출하면 일반적으로spgAddNode결과, 아마도 노드 이후
분할 단계에 추가된 라벨은 새 값과 일치하지 않습니다.
그 후에 마침내 세 번째 전화가 올 것입니다.
반품spgMatchNode그리고 허용합니다
잎 수준으로 내려가는 삽입.
picksplit세트 위에 새로운 내부 튜플을 생성하는 방법을 결정합니다. 리프 튜플.
그SQL선언 함수는 다음과 같아야 합니다:
CREATE FUNCTION my_picksplit(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgPickSplitIn입력을 포함하는 C 구조체 기능에 대한 데이터입니다. 두 번째 인수는 다음을 가리키는 포인터입니다. 에spgPickSplitOutC 구조체, 함수는 결과 데이터로 채워야 합니다.
typedef 구조체 spgPickSplitIn
int nTuples; /* 리프 튜플의 수 */
데이텀 *데이텀; /* 해당 데이텀(길이가 nTuples인 배열) */
정수 수준; /* 현재 레벨(0부터 계산) */
spgPickSplitIn;
typedef 구조체 spgPickSplitOut
bool hasPrefix; /* 새로운 내부 튜플에는 접두사가 있어야 합니까? */
데이텀 접두사Datum; /* 그렇다면 그 값 */
int nNodes; /* 새로운 내부 튜플의 노드 수 */
데이텀 *nodeLabels; /* 해당 레이블(또는 레이블이 없는 경우 NULL) */
int *mapTuplesToNodes; /* 각 리프 튜플에 대한 노드 인덱스 */
데이텀 *leafTupleDatums; /* 각각의 새 리프 튜플에 저장할 데이터 */
spgPickSplitOut;
n윈 토토수는 리프 윈 토토이 제공됩니다.데이텀은 데이텀 값의 배열입니다.레벨현재 레벨은 모든 리프 튜플 공유는 새로운 수준이 됩니다. 내부 튜플.
설정hasPrefix표시하다
새로운 내부 튜플에 접두사가 있어야 하는지 여부, 그렇다면
설정prefixDatum접두사에
가치. 설정n노드표시하다
새로운 내부 튜플이 포함할 노드 수,
그리고 설정노드 라벨배열에
라벨 값. (노드에 레이블이 필요하지 않은 경우
설정노드 라벨NULL로; 참조섹션
54.3.2자세한 내용은.) 설정mapTuplesToNodes다음을 제공하는 배열에
각 리프 튜플이 있는 노드의 인덱스(0부터)
에 할당해야 합니다. 설정leafTupleDatums배열에
새 리프 윈 토토에 저장될 값(이것은
입력과 동일데이텀연산자 클래스가 한 수준의 데이텀을 수정하지 않는 경우
다음으로). 참고하세요picksplit함수는 다음을 담당합니다.
팔로킹 중노드 라벨,
mapTuplesToNodes그리고leafTupleDatums배열.
두 개 이상의 리프 튜플이 제공되면 다음이 예상됩니다.
그picksplit함수
둘 이상의 노드로 분류합니다. 그렇지 않으면 그것은
리프 튜플을 여러 개로 분할할 수 없습니다.
이 작업의 궁극적인 목적은 페이지입니다.
그러므로 만일picksplit함수는 결국 모든 리프 튜플을 동일한 위치에 배치합니다.
노드에서는 핵심 SP-GiST 코드가 해당 결정을 무시하고
리프 튜플이 포함된 내부 튜플을 생성합니다.
동일하게 레이블이 지정된 여러 노드에 무작위로 할당됩니다.
이러한 튜플은 표시됩니다.allTheSame이런 일이 일어났음을 나타냅니다.선택그리고내부_일관성함수는 다음을 수행해야 합니다.
그러한 내부 튜플을 적절하게 관리하십시오. 참조섹션
54.3.3더 많은 정보를 원하시면.
picksplit적용 가능
다음과 같은 경우에만 단일 리프 튜플에 적용됩니다.구성기능 세트lo윈 토토ValuesOK참으로 그리고
페이지보다 큰 입력 값이 제공되었습니다. 이에
작업의 요점이 접두사를 제거하는 것인 경우
새롭고 더 짧은 리프 데이텀 값을 생성합니다. 통화는
잎 데이텀이 충분히 짧아질 때까지 반복됩니다.
페이지가 제작되었습니다. 참조섹션
54.3.1더 많은 정보를 원하시면.
내부_일관성트리 동안 따라갈 노드(가지) 세트를 반환합니다. 검색하세요.
그SQL선언 함수는 다음과 같아야 합니다:
CREATE FUNCTION my_inner_contant(내부, 내부) 반환 무효 ...
첫 번째 인수는 a에 대한 포인터입니다.spgInnerCondependentInC 구조체, 다음을 포함 함수에 대한 입력 데이터입니다. 두 번째 주장은 a에 대한 포인터spgInnerCondependentOutC 구조체, 이는 함수는 결과 데이터로 채워야 합니다.
typedef 구조체 spgInnerCondependentIn
ScanKey 스캔키; /* 연산자 및 비교 값의 배열 */
int nkeys; /* 배열의 길이 */
재구성된 데이터값; /* 부모에서 재구성된 값 */
정수 수준; /* 현재 레벨(0부터 계산) */
bool returnData; /* 원본 데이터를 반환해야 합니까? */
/* 현재 내부 튜플의 데이터 */
bool allTheSame; /* 튜플은 모두 동일하게 표시됩니까? */
bool hasPrefix; /* 튜플에 접두사가 있나요? */
데이텀 접두사Datum; /* 그렇다면 접두사 값 */
int nNodes; /* 내부 튜플의 노드 수 */
데이텀 *nodeLabels; /* 노드 레이블 값(없으면 NULL) */
spgInner일관성In;
typedef 구조체 spgInnerCondependentOut
int nNodes; /* 방문할 자식 노드 수 */
int *nodeNumbers; /* 노드 배열의 인덱스 */
int *levelAdds; /* 각각에 대해 이만큼 레벨을 증가시킵니다 */
데이텀 *reconstructedValues; /* 관련 재구성된 값 */
spgInnerCondependentOut;
배열스캔키, 중
길이nkeys, 다음을 설명합니다.
인덱스 검색 조건. 이러한 조건이 결합되어
AND 사용 — 모든 항목을 만족하는 인덱스 항목만
흥미롭다. (참고하세요n키= 0은 모든 인덱스 항목이 쿼리를 충족함을 의미합니다.)
일반적으로 일관된 기능은 다음에만 관심이 있습니다.sk_strategy그리고sk_argument각 배열 항목의 필드,
이는 각각 인덱싱 가능한 연산자를 제공하고
비교값. 특히 그럴 필요는 없다.
확인sk_flags다음이
비교 값은 NULL입니다. SP-GiST 핵심 코드이기 때문입니다.
그러한 조건을 필터링합니다.reconstructedValue값입니다
상위 튜플에 대해 재구성됩니다. 그것은(데이텀) 0루트 수준에서 또는 다음과 같은 경우내부_일관성함수가 그랬습니다
상위 수준에서 값을 제공하지 마세요.레벨현재 내부 튜플입니다
레벨, 루트 레벨의 경우 0부터 시작합니다.반환데이터is사실재구성된 데이터가 필요한 경우
이 쿼리; 이는 다음과 같은 경우에만 해당됩니다.구성함수 주장canReturnData. allTheSame현재 내부인 경우 true입니다.
튜플이 표시됨"모두 똑같습니다";
이 경우 모든 노드는 동일한 레이블(있는 경우)을 가지며
따라서 모두 쿼리와 일치하거나 전혀 일치하지 않습니다(참조섹션
54.3.3). hasPrefix사실입니다
현재 내부 튜플에 접두사가 포함된 경우; 그렇다면,prefixDatum그 값입니다.n노드아이의 수입니다
내부 튜플에 포함된 노드 및노드 라벨은 라벨의 배열입니다.
값이거나 노드에 레이블이 없으면 NULL입니다.
n노드다음으로 설정되어야 합니다.
방문해야 하는 하위 노드 수
검색하고노드번호반드시
인덱스 배열로 설정됩니다. 연산자 클래스인 경우
레벨을 추적하고 설정합니다.levelAdds레벨 배열에
각 노드로 내려갈 때 필요한 증분
방문했습니다. (종종 이러한 증가분은 모든 항목에 대해 동일합니다.
하지만 꼭 그런 것은 아니므로 배열은 다음과 같습니다.
사용됩니다.) 값 재구성이 필요한 경우 설정reconstructedValues배열에
방문할 각 하위 노드에 대해 재구성된 값;
그렇지 않으면 떠나세요reconstructedValuesNULL로. 참고하세요내부_일관성함수
palloc'i윈 토토을 담당합니다.노드번호, levelAdds그리고reconstructedValues배열.
잎_일관성리프 윈 토토이 쿼리를 만족하면 참을 반환합니다.
그SQL선언 함수는 다음과 같아야 합니다:
CREATE FUNCTION my_leaf_contant(내부, 내부) RETURNS bool ...
첫 번째 인수는 a에 대한 포인터입니다.spgLeafCondependentInC 구조체, 다음을 포함 함수에 대한 입력 데이터입니다. 두 번째 주장은 a에 대한 포인터spgLeafCondependentOutC 구조체, 이는 함수는 결과 데이터로 채워야 합니다.
typedef 구조체 spgLeafContantIn
ScanKey 스캔키; /* 연산자 및 비교 값의 배열 */
int nkeys; /* 배열의 길이 */
재구성된 데이터값; /* 부모에서 재구성된 값 */
정수 수준; /* 현재 레벨(0부터 계산) */
bool returnData; /* 원본 데이터를 반환해야 합니까? */
데이텀 리프Datum; /* 리프 튜플의 데이터 */
spgLeaf일관적In;
typedef 구조체 spgLeafCondependentOut
데이텀 리프값; /* 원본 데이터가 있으면 재구성 */
부울 재확인; /* 연산자를 다시 확인해야 하는 경우 true로 설정 */
spgLeafCondependentOut;
배열스캔키, 중
길이nkeys, 다음을 설명합니다.
인덱스 검색 조건. 이러한 조건이 결합되어
AND 사용 — 모든 항목을 만족하는 인덱스 항목만
쿼리를 만족시키세요. (참고하세요n키= 0은 모든 색인 항목을 의미합니다.
쿼리를 만족시킵니다.) 일반적으로 일관된 기능만
신경 쓰인다sk_strategy그리고sk_argument각 필드
각각 인덱싱 가능한 연산자를 제공하는 배열 항목
그리고 비교값. 특히 그럴 필요는 없다.
확인sk_flags다음이
비교 값은 NULL입니다. SP-GiST 핵심 코드이기 때문입니다.
그러한 조건을 필터링합니다.reconstructedValue값입니다
상위 튜플에 대해 재구성됩니다. 그것은(데이텀) 0루트 수준에서 또는 다음과 같은 경우내부_일관성함수가 그랬습니다
상위 수준에서 값을 제공하지 마세요.레벨은 현재 리프 튜플의 레벨입니다.
루트 수준의 경우 0부터 시작합니다.반환데이터is참재구성된 데이터가 필요한 경우
이 쿼리; 이는 다음과 같은 경우에만 해당됩니다.구성함수 주장canReturnData. leafDatum은(는) 다음에 저장된 키 값입니다.
현재 리프 튜플.
함수는 반드시 반환되어야 합니다참리프 튜플이 쿼리와 일치하는 경우, 또는거짓그렇지 않다면. 에서참케이스, if반환데이터is참그런 다음잎값값으로 설정되어야 합니다. 원래는 이 리프 튜플에 대해 인덱싱되도록 제공되었습니다. 또한,다시 확인다음으로 설정될 수 있음참일치가 불확실하고 따라서 연산자를 실제 힙에 다시 적용해야 합니다. 일치를 확인하기 위한 윈 토토입니다.
모든 SP-GiST 지원 방법은 일반적으로
단기 메모리 컨텍스트; 즉,CurrentMemoryContext다음 이후에 재설정됩니다
각 튜플을 처리합니다. 그러므로 다음을 수행하는 것은 그다지 중요하지 않습니다.
palloc하는 모든 것을 해제하는 것에 대해 걱정하십시오. (그구성메서드는 예외입니다. 다음을 시도해야 합니다.
메모리 누수를 방지하세요. 그러나 일반적으로구성메서드는 할당 외에는 아무것도 하지 않아도 됩니다.
전달된 매개변수 구조체에 상수를 추가합니다.)
인덱싱된 열이 조합 가능한 데이터 유형인 경우 인덱스는
데이터 정렬은 다음을 사용하여 모든 지원 방법에 전달됩니다.
표준PG_GET_COLLATION()메커니즘.