브린블록 범위 지수를 나타냅니다.브린은 특정 열이 테이블 내의 물리적 위치와 자연스러운 상관 관계를 갖는 매우 큰 테이블을 처리하도록 설계되었습니다.
브린다음의 관점에서 작동합니다블록 범위(또는“페이지 범위”). 블록 범위는 테이블에서 물리적으로 인접한 페이지 그룹입니다. 각 블록 범위에 대해 일부 요약 정보가 인덱스에 저장됩니다. 예를 들어, 상점의 판매 주문을 저장하는 테이블에는 각 주문이 접수된 날짜 열이 있을 수 있으며 대부분의 경우 이전 주문에 대한 항목도 테이블의 앞부분에 표시됩니다. 우편번호 열을 저장하는 테이블에는 도시의 모든 코드가 자연스럽게 그룹화되어 있을 수 있습니다.
브린인덱스는 일반 비트맵 인덱스 스캔을 통해 쿼리를 충족할 수 있으며 인덱스에 저장된 요약 정보가 다음과 같은 경우 각 범위 내의 모든 페이지에 있는 모든 튜플을 반환합니다.일관적인쿼리 조건으로. 쿼리 실행기는 이러한 튜플을 다시 확인하고 쿼리 조건과 일치하지 않는 튜플을 삭제하는 일을 담당합니다. 즉, 이러한 인덱스는 손실이 있습니다. 왜냐하면브린색인은 매우 작습니다. 색인을 스캔하면 순차 스캔에 비해 오버헤드가 거의 추가되지 않지만 일치하는 튜플을 포함하지 않는 것으로 알려진 테이블의 큰 부분을 스캔하지 않을 수 있습니다.
a의 특정 데이터브린색인이 저장할 수 있는 특정 쿼리뿐만 아니라 색인이 충족할 수 있는 특정 쿼리는 색인의 각 열에 대해 선택된 연산자 클래스에 따라 달라집니다. 선형 정렬 순서를 갖는 데이터 유형에는 각 블록 범위 내의 최소값과 최대값을 저장하는 연산자 클래스가 있을 수 있습니다. 기하학적 유형은 블록 범위의 모든 객체에 대한 경계 상자를 저장할 수 있습니다.
블록 범위의 크기는 인덱스 생성 시간에 다음과 같이 결정됩니다.pages_per_range저장 매개변수. 색인 항목 수는 페이지의 관계 크기를 선택한 값으로 나눈 값과 같습니다.pages_per_range. 따라서 숫자가 작을수록 인덱스는 더 커지지만(더 많은 인덱스 항목을 저장해야 하기 때문에) 동시에 저장된 요약 데이터는 더 정확할 수 있으며 인덱스 스캔 중에 더 많은 데이터 블록을 건너뛸 수 있습니다.
생성 시 기존의 모든 힙 페이지가 검색되고 끝에 불완전할 수 있는 범위를 포함하여 각 범위에 대해 요약 인덱스 튜플이 생성됩니다. 새 페이지가 데이터로 채워지면 이미 요약된 페이지 범위로 인해 요약 정보가 새 튜플의 데이터로 업데이트됩니다. 마지막 요약 범위에 속하지 않는 새 페이지가 생성되면 새 페이지가 속한 범위는 자동으로 요약 튜플을 획득하지 않습니다. 해당 튜플은 나중에 요약 실행이 호출되어 해당 범위에 대한 초기 요약을 생성할 때까지 요약되지 않은 상태로 유지됩니다.
페이지 범위의 초기 요약을 실행하는 방법에는 여러 가지가 있습니다. 테이블을 수동으로 또는 다음 방법으로 진공 청소하는 경우자동 진공, 기존의 요약되지 않은 모든 페이지 범위가 요약됩니다. 또한 인덱스의 경우자동 요약매개변수가 활성화되어 있지만 기본적으로는 그렇지 않습니다. 해당 데이터베이스에서 autovacuum이 실행될 때마다 테이블 자체가 autovacuum에 의해 처리되는지 여부에 관계없이 채워진 요약되지 않은 모든 페이지 범위에 대해 요약이 발생합니다. 아래를 참조하세요.
마지막으로 다음 함수를 사용할 수 있습니다(이 함수가 실행되는 동안검색_경로일시적으로 다음으로 변경되었습니다.pg_catalog, pg_temp):
brin_summarize_new_values(regclass)요약되지 않은 모든 범위를 요약합니다. |
brin_summarize_range(regclass, bigint)요약되지 않은 경우 해당 페이지를 포함하는 범위만 요약합니다. |
자동 요약이 활성화되면 요청이 다음으로 전송됩니다.자동 진공다음 블록 범위의 첫 번째 페이지의 첫 번째 항목에 대한 삽입이 감지될 때 블록 범위에 대한 대상 요약을 실행하고 다음에 자동 진공 작업자가 동일한 데이터베이스에서 실행을 마칠 때 이행됩니다. 요청 큐가 가득 차면 요청이 기록되지 않고 서버 로그에 메시지가 전송됩니다.
로그: 인덱스 "brin_wi_idx" 페이지 128에 대한 BRIN 범위 요약 요청이 기록되지 않았습니다
이런 일이 발생하면 테이블에서 다음 정규 진공 실행이 실행되거나 위에 언급된 기능 중 하나가 호출될 때까지 범위가 요약되지 않은 상태로 유지됩니다.
반대로, 다음을 사용하여 범위를 요약 해제할 수 있습니다.brin_desummarize_range(regclass, bigint)함수는 기존 값이 변경되어 인덱스 튜플이 더 이상 좋은 표현이 아닐 때 유용합니다. 참조섹션 9.28.8자세한 내용은.
핵심PostgreSQL배포에는 다음이 포함됩니다브린다음에 표시된 연산자 클래스표 64.4.
그최소최대연산자 클래스는 범위 내의 색인화된 열에 나타나는 최소값과 최대값을 저장합니다.포함연산자 클래스는 범위 내의 색인화된 열에 있는 값을 포함하는 값을 저장합니다.블룸연산자 클래스는 범위의 모든 값에 대해 Bloom 필터를 구축합니다.최소최대-멀티연산자 클래스는 범위 내의 색인화된 열에 나타나는 값을 나타내는 여러 개의 최소값과 최대값을 저장합니다.
표 64.4. 내장브린연산자 클래스
| 이름 | 인덱싱 가능한 연산자 |
|---|---|
bit_minmax_ops |
= (비트,비트) |
< (비트,비트) |
|
(비트,비트) |
|
<= (비트,비트) |
|
= (비트,비트) |
|
box_inclusion_ops |
@ (상자,점) |
<< (상자,상자) |
|
&< (상자,상자) |
|
& (상자,상자) |
|
(상자,상자) |
|
<@ (상자,상자) |
|
@ (상자,상자) |
|
~= (상자,상자) |
|
&& (상자,상자) |
|
<<| (상자,상자) |
|
&<| (상자, 상자) |
|
|& (상자,상자) |
|
| (상자,상자) |
|
bpchar_bloom_ops |
= (문자,문자) |
bpchar_minmax_ops |
= (문자,문자) |
< (문자,문자) |
|
<= (문자,문자) |
|
(문자,문자) |
|
= (문자,문자) |
|
bytea_bloom_ops |
= (바이테아,바이테아) |
bytea_minmax_ops |
= (바이테아,바이테아) |
< (바이테아,바이테아) |
|
<= (바이테아,바이테아) |
|
(바이테아,바이테아) |
|
= (바이테아,바이테아) |
|
char_bloom_ops |
= ("문자","문자") |
char_minmax_ops |
= ("문자","문자") |
< ("문자","문자") |
|
<= ("문자","문자") |
|
("문자","문자") |
|
= ("문자","문자") |
|
date_bloom_ops |
= (날짜,날짜) |
date_minmax_ops |
= (날짜,날짜) |
< (날짜,날짜) |
|
<= (날짜,날짜) |
|
(날짜,날짜) |
|
= (날짜,날짜) |
|
date_minmax_multi_ops |
= (날짜,날짜) |
< (날짜,날짜) |
|
<= (날짜,날짜) |
|
(날짜,날짜) |
|
= (날짜,날짜) |
|
float4_bloom_ops |
= (float4,float4) |
float4_minmax_ops |
= (float4,float4) |
< (float4,float4) |
|
(float4,float4) |
|
<= (float4,float4) |
|
= (float4,float4) |
|
float4_minmax_multi_ops |
= (float4,float4) |
< (float4,float4) |
|
(float4,float4) |
|
<= (float4,float4) |
|
= (float4,float4) |
|
float8_bloom_ops |
= (float8,float8) |
float8_minmax_ops |
= (float8,float8) |
< (float8,float8) |
|
<= (float8,float8) |
|
(float8,float8) |
|
= (float8,float8) |
|
float8_minmax_multi_ops |
= (float8,float8) |
< (float8,float8) |
|
<= (float8,float8) |
|
(float8,float8) |
|
= (float8,float8) |
|
inet_inclusion_ops |
<< (inet,inet) |
<<= (inet,inet) |
|
(inet,inet) |
|
= (inet,inet) |
|
= (inet,inet) |
|
&& (inet,inet) |
|
inet_bloom_ops |
= (inet,inet) |
inet_minmax_ops |
= (inet,inet) |
< (inet,inet) |
|
<= (inet,inet) |
|
(inet,inet) |
|
= (inet,inet) |
|
inet_minmax_multi_ops |
= (inet,inet) |
< (inet,inet) |
|
<= (inet,inet) |
|
(inet,inet) |
|
= (inet,inet) |
|
int2_bloom_ops |
= (int2,int2) |
int2_minmax_ops |
= (int2,int2) |
< (int2,int2) |
|
(int2,int2) |
|
<= (int2,int2) |
|
= (int2,int2) |
|
int2_minmax_multi_ops |
= (int2,int2) |
< (int2,int2) |
|
(int2,int2) |
|
<= (int2,int2) |
|
= (int2,int2) |
|
int4_bloom_ops |
= (int4,int4) |
int4_minmax_ops |
= (int4,int4) |
< (int4,int4) |
|
(int4,int4) |
|
<= (int4,int4) |
|
= (int4,int4) |
|
int4_minmax_multi_ops |
= (int4,int4) |
< (int4,int4) |
|
(int4,int4) |
|
<= (int4,int4) |
|
= (int4,int4) |
|
int8_bloom_ops |
= (bigint,bigint) |
int8_minmax_ops |
= (bigint,bigint) |
< (bigint,bigint) |
|
(bigint,bigint) |
|
<= (bigint,bigint) |
|
= (bigint,bigint) |
|
int8_minmax_multi_ops |
= (bigint,bigint) |
< (bigint,bigint) |
|
(bigint,bigint) |
|
<= (bigint,bigint) |
|
= (bigint,bigint) |
|
interval_bloom_ops |
= (간격,간격) |
interval_minmax_ops |
= (간격,간격) |
< (간격,간격) |
|
<= (간격,간격) |
|
(간격,간격) |
|
= (간격,간격) |
|
interval_minmax_multi_ops |
= (간격,간격) |
< (간격,간격) |
|
<= (간격,간격) |
|
(간격,간격) |
|
= (간격,간격) |
|
macaddr_bloom_ops |
= (macaddr,macaddr) |
macaddr_minmax_ops |
= (macaddr,macaddr) |
< (macaddr,macaddr) |
|
<= (macaddr,macaddr) |
|
(macaddr,macaddr) |
|
= (macaddr,macaddr) |
|
macaddr_minmax_multi_ops |
= (macaddr,macaddr) |
< (macaddr,macaddr) |
|
<= (macaddr,macaddr) |
|
(macaddr,macaddr) |
|
= (macaddr,macaddr) |
|
macaddr8_bloom_ops |
= (macaddr8,macaddr8) |
macaddr8_minmax_ops |
= (macaddr8,macaddr8) |
< (macaddr8,macaddr8) |
|
<= (macaddr8,macaddr8) |
|
(macaddr8,macaddr8) |
|
= (macaddr8,macaddr8) |
|
macaddr8_minmax_multi_ops |
= (macaddr8,macaddr8) |
< (macaddr8,macaddr8) |
|
<= (macaddr8,macaddr8) |
|
(macaddr8,macaddr8) |
|
= (macaddr8,macaddr8) |
|
name_bloom_ops |
= (이름,이름) |
name_minmax_ops |
= (이름,이름) |
< (이름,이름) |
|
<= (이름,이름) |
|
(이름,이름) |
|
= (이름,이름) |
|
numeric_bloom_ops |
= (숫자,숫자) |
numeric_minmax_ops |
= (숫자,숫자) |
< (숫자,숫자) |
|
<= (숫자,숫자) |
|
(숫자,숫자) |
|
= (숫자,숫자) |
|
numeric_minmax_multi_ops |
= (숫자,숫자) |
< (숫자,숫자) |
|
<= (숫자,숫자) |
|
(숫자,숫자) |
|
= (숫자,숫자) |
|
oid_bloom_ops |
= (oid,oid) |
oid_minmax_ops |
= (oid,oid) |
< (oid,oid) |
|
(oid,oid) |
|
<= (oid,oid) |
|
= (oid,oid) |
|
oid_minmax_multi_ops |
= (oid,oid) |
< (oid,oid) |
|
(oid,oid) |
|
<= (oid,oid) |
|
= (oid,oid) |
|
pg_lsn_bloom_ops |
= (pg_lsn,pg_lsn) |
pg_lsn_minmax_ops |
= (pg_lsn,pg_lsn) |
< (pg_lsn,pg_lsn) |
|
(pg_lsn,pg_lsn) |
|
<= (pg_lsn,pg_lsn) |
|
= (pg_lsn,pg_lsn) |
|
pg_lsn_minmax_multi_ops |
= (pg_lsn,pg_lsn) |
< (pg_lsn,pg_lsn) |
|
(pg_lsn,pg_lsn) |
|
<= (pg_lsn,pg_lsn) |
|
= (pg_lsn,pg_lsn) |
|
range_inclusion_ops |
= (모든 범위,모든 범위) |
< (모든 범위,모든 범위) |
|
<= (모든 범위,모든 범위) |
|
= (모든 범위,모든 범위) |
|
(모든 범위,모든 범위) |
|
&&(모든 범위,모든 범위) |
|
@ (모든 범위, 모든 요소) |
|
@ (모든 범위,모든 범위) |
|
<@ (모든 범위,모든 범위) |
|
<< (모든 범위,모든 범위) |
|
(모든범위,모든범위) |
|
&< (모든 범위,모든 범위) |
|
& (모든 범위,모든 범위) |
|
-|- (모든 범위,모든 범위) |
|
text_bloom_ops |
= (텍스트,텍스트) |
text_minmax_ops |
= (텍스트,텍스트) |
< (텍스트,텍스트) |
|
<= (텍스트,텍스트) |
|
(텍스트,텍스트) |
|
= (텍스트,텍스트) |
|
tid_bloom_ops |
= (tid,tid) |
tid_minmax_ops |
= (tid,tid) |
< (조금,조금) |
|
(tid,tid) |
|
<= (tid,tid) |
|
= (tid,tid) |
|
tid_minmax_multi_ops |
= (tid,tid) |
< (조금,조금) |
|
(tid,tid) |
|
<= (tid,tid) |
|
= (tid,tid) |
|
timestamp_bloom_ops |
= (타임스탬프,타임스탬프) |
timestamp_minmax_ops |
= (타임스탬프,타임스탬프) |
< (타임스탬프,타임스탬프) |
|
<= (타임스탬프,타임스탬프) |
|
(타임스탬프,타임스탬프) |
|
= (타임스탬프,타임스탬프) |
|
timestamp_minmax_multi_ops |
= (타임스탬프,타임스탬프) |
< (타임스탬프,타임스탬프) |
|
<= (타임스탬프,타임스탬프) |
|
(타임스탬프,타임스탬프) |
|
= (타임스탬프,타임스탬프) |
|
timestamptz_bloom_ops |
= (타임스탬프tz,타임스탬프tz) |
timestamptz_minmax_ops |
= (타임스탬프tz,타임스탬프tz) |
< (timestamptz,timestamptz) |
|
<= (timestamptz,timestamptz) |
|
(타임스탬프츠,타임스탬프츠) |
|
= (타임스탬프tz,타임스탬프tz) |
|
timestamptz_minmax_multi_ops |
= (타임스탬프tz,타임스탬프tz) |
< (timestamptz,timestamptz) |
|
<= (timestamptz,timestamptz) |
|
(타임스탬프tz,타임스탬프tz) |
|
= (타임스탬프tz,타임스탬프tz) |
|
time_bloom_ops |
= (시간, 시간) |
time_minmax_ops |
= (시간, 시간) |
< (시간, 시간) |
|
<= (시간, 시간) |
|
(시간, 시간) |
|
= (시간,시간) |
|
time_minmax_multi_ops |
= (시간,시간) |
< (시간,시간) |
|
<= (시간,시간) |
|
(시간, 시간) |
|
= (시간,시간) |
|
timetz_bloom_ops |
= (timetz,timetz) |
timetz_minmax_ops |
= (timetz,timetz) |
< (timetz,timetz) |
|
<= (timetz,timetz) |
|
(timetz,timetz) |
|
= (timetz,timetz) |
|
timetz_minmax_multi_ops |
= (timetz,timetz) |
< (timetz,timetz) |
|
<= (timetz,timetz) |
|
(티메츠,티메츠) |
|
= (timetz,timetz) |
|
uuid_bloom_ops |
= (uuid,uuid) |
uuid_minmax_ops |
= (uuid,uuid) |
< (uuid,uuid) |
|
(uuid,uuid) |
|
<= (uuid,uuid) |
|
= (uuid,uuid) |
|
uuid_minmax_multi_ops |
= (uuid,uuid) |
< (uuid,uuid) |
|
(uuid,uuid) |
|
<= (uuid,uuid) |
|
= (uuid,uuid) |
|
varbit_minmax_ops |
= (varbit,varbit) |
< (varbit,varbit) |
|
(varbit,varbit) |
|
<= (varbit,varbit) |
|
= (varbit,varbit) |
내장된 연산자 클래스 중 일부는 연산자 클래스의 동작에 영향을 미치는 매개변수를 지정할 수 있습니다. 각 연산자 클래스에는 고유한 허용 매개변수 세트가 있습니다. 오직블룸그리고최소최대-멀티연산자 클래스는 매개변수 지정을 허용합니다:
블룸 연산자 클래스는 다음 매개변수를 허용합니다:
n_distinct_per_range다음에서 사용하는 블록 범위에서 Null이 아닌 고유한 값의 추정 개수를 정의합니다.브린블룸 필터 크기 조정을 위한 블룸 인덱스입니다. 다음과 유사하게 동작합니다.n_distinct옵션테이블 변경. 양수 값으로 설정되면 각 블록 범위에는 Null이 아닌 고유한 값이 이 개수만큼 포함되는 것으로 가정됩니다. -1보다 크거나 같아야 하는 음수 값으로 설정되면 Null이 아닌 고유 값의 수는 블록 범위(블록당 약 290개 행)에서 가능한 최대 튜플 수에 따라 선형적으로 증가하는 것으로 가정됩니다. 기본값은-0.1, null이 아닌 고유한 값의 최소 개수는16.
false_긍정적_비율다음에서 사용되는 원하는 거짓 긍정 비율을 정의합니다.브린블룸 필터 크기 조정을 위한 블룸 인덱스입니다. 값은 0.0001에서 0.25 사이여야 합니다. 기본값은 0.01이며, 이는 거짓양성률 1%입니다.
minmax-multi 연산자 클래스는 다음 매개변수를 허용합니다:
값_범위당저장된 값의 최대 개수를 정의합니다.브린minmax 인덱스는 블록 범위를 요약합니다. 각 값은 점이나 간격의 경계를 나타낼 수 있습니다. 값은 8~256 사이여야 하며 기본값은 32입니다.
그브린인터페이스는 추상화 수준이 높기 때문에 액세스 방법 구현자가 액세스되는 데이터 유형의 의미 체계만 구현하면 됩니다.브린계층 자체가 동시성을 관리하고 색인 구조를 로깅 및 검색합니다.
을 얻기 위해 필요한 모든 것브린액세스 방법 작동은 인덱스에 저장된 요약 값의 동작과 스캔 키와 상호 작용하는 방식을 정의하는 몇 가지 사용자 정의 방법을 구현하는 것입니다. 한마디로,브린확장성과 일반성, 코드 재사용 및 깔끔한 인터페이스를 결합합니다.
연산자 클래스에는 네 가지 메소드가 있습니다.브린다음을 제공해야 합니다.
BrinOpcInfo *opcInfo(Oid type_oid)인덱싱된 열의 요약 데이터에 대한 내부 정보를 반환합니다. 반환 값은 palloc'd를 가리켜야 합니다.BrinOpcInfo, 다음과 같은 정의가 있습니다.
typedef 구조체 BrinOpcInfo
/* 이 opclass의 인덱스 열에 저장된 열 수 */
uint16 oi_nstored;
/* opclass의 개인적인 사용을 위한 불투명 포인터 */
무효 *oi_opaque;
/* 저장된 열의 캐시 항목을 입력하세요 */
TypeCacheEntry *oi_typcache[FLEXIBLE_ARRAY_MEMBER];
BrinOpcInfo;
BrinOpcInfo.oi_opaque연산자 클래스 루틴에서 색인 스캔 중에 지원 기능 간에 정보를 전달하는 데 사용할 수 있습니다.
부울 일관성(BrinDesc *bdesc, BrinValues *열, ScanKey *keys, int nkeys)모든 ScanKey 항목이 범위에 대해 지정된 색인 값과 일치하는지 여부를 반환합니다. 사용할 속성 번호는 스캔 키의 일부로 전달됩니다. 동일한 속성에 대한 여러 스캔 키가 한 번에 전달될 수 있습니다. 항목 수는 다음에 의해 결정됩니다.n키매개변수.
부울 일관성(BrinDesc *bdesc, BrinValues *열, ScanKey 키)ScanKey가 범위에 대해 주어진 색인 값과 일치하는지 여부를 반환합니다. 사용할 속성 번호는 스캔 키의 일부로 전달됩니다. 이는 일관된 기능의 이전 버전과 호환되는 변형입니다.
bool addValue(BrinDesc *bdesc, BrinValues *column, Datum newval, bool isnull)인덱스 튜플과 인덱싱된 값이 주어지면 튜플의 표시된 속성을 수정하여 추가로 새 값을 나타냅니다. 튜플이 수정된 경우,참반환되었습니다.
bool UnionTuples(BrinDesc *bdesc, BrinValues *a, BrinValues *b)두 개의 인덱스 튜플을 통합합니다. 두 개의 인덱스 튜플이 있는 경우 두 튜플을 모두 나타내도록 첫 번째 항목의 표시된 속성을 수정합니다. 두 번째 튜플은 수정되지 않습니다.
다음에 대한 연산자 클래스브린선택적으로 다음 방법을 지정할 수 있습니다.
void 옵션(local_relopts *relopts)연산자 클래스 동작을 제어하는 사용자에게 표시되는 매개변수 세트를 정의합니다.
그옵션함수는 a에 대한 포인터를 전달받습니다.local_reloptsstruct, 연산자 클래스별 옵션 세트로 채워져야 합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스할 수 있습니다.PG_HAS_OPCLASS_OPTIONS()그리고PG_GET_OPCLASS_OPTIONS()매크로.
인덱싱된 값의 키 추출과 키의 표현이 모두 포함되어 있으므로브린유연하며 사용자가 지정한 매개변수에 따라 달라질 수 있습니다.
핵심 배포판에는 minmax, minmax-multi, inclusion 및 Bloom의 네 가지 유형의 연산자 클래스에 대한 지원이 포함됩니다. 이를 사용하는 연산자 클래스 정의는 적절하게 내부 데이터 유형에 대해 제공됩니다. 사용자는 소스 코드를 작성할 필요 없이 동등한 정의를 사용하여 다른 데이터 유형에 대해 추가 연산자 클래스를 정의할 수 있습니다. 선언되는 적절한 카탈로그 항목이면 충분합니다. 연산자 전략의 의미에 대한 가정은 지원 함수의 소스 코드에 포함되어 있습니다.
완전히 다른 의미를 구현하는 연산자 클래스도 가능합니다. 단, 위에 설명된 네 가지 주요 지원 기능의 구현이 작성되어 있어야 합니다. 주요 릴리스 간의 이전 버전과의 호환성은 보장되지 않습니다. 예를 들어 이후 릴리스에서는 추가 지원 기능이 필요할 수 있습니다.
완전히 정렬된 집합을 구현하는 데이터 유형에 대한 연산자 클래스를 작성하려면 다음과 같이 해당 연산자와 함께 minmax 지원 함수를 사용할 수 있습니다.표 64.5. 모든 연산자 클래스 멤버(함수 및 연산자)는 필수입니다.
표 64.5. Minmax 연산자 클래스의 기능 및 지원 번호
| 연산자 클래스 멤버 | 개체 |
|---|---|
| 지원 기능 1 | 내부 함수brin_minmax_opcinfo() |
| 지원 기능 2 | 내부 함수brin_minmax_add_value() |
| 지원 기능 3 | 내부 함수brin_minmax_conpersist() |
| 지원 기능 4 | 내부 함수brin_minmax_union() |
| 윈 토토 전략 1 | 연산자보다 작음 |
| 윈 토토 전략 2 | 작거나 같음 연산자 |
| 윈 토토 전략 3 | 연산자와 같음 |
| 윈 토토 전략 4 | 보다 크거나 같음 연산자 |
| 윈 토토 전략 5 | 보다 큼 연산자 |
다른 유형 내에 값이 포함된 복잡한 데이터 유형에 대한 연산자 클래스를 작성하려면 다음과 같이 해당 연산자와 함께 포함 지원 함수를 사용할 수 있습니다.표 64.6. 어떤 언어로든 작성할 수 있는 단 하나의 추가 기능만 필요합니다. 추가 기능을 위해 더 많은 기능을 정의할 수 있습니다. 모든 연산자는 선택 사항입니다. 표에 종속 항목으로 표시된 것처럼 일부 연산자에는 다른 연산자가 필요합니다.
표 64.6. 포함 연산자 클래스의 기능 및 지원 번호
| 윈 토토 클래스 구성원 | 개체 | 종속성 |
|---|---|---|
| 지원 기능 1 | 내부 함수brin_inclusion_opcinfo() |
|
| 지원 기능 2 | 내부 함수brin_inclusion_add_value() |
|
| 지원 기능 3 | 내부 함수brin_inclusion_contention() |
|
| 지원 기능 4 | 내부 함수brin_inclusion_union() |
|
| 지원 기능 11 | 두 요소를 병합하는 함수 | |
| 지원 기능 12 | 두 요소가 병합 가능한지 확인하는 선택적 함수 | |
| 지원 기능 13 | 요소가 다른 요소 내에 포함되어 있는지 확인하는 선택적 함수 | |
| 지원 기능 14 | 요소가 비어 있는지 확인하는 선택적 함수 | |
| 윈 토토 전략 1 | 연산자 왼쪽 | 윈 토토 전략 4 |
| 윈 토토 전략 2 | 연산자는 오른쪽으로 확장하지 않습니다. | 윈 토토 전략 5 |
| 윈 토토 전략 3 | 연산자가 겹침 | |
| 윈 토토 전략 4 | 연산자는 왼쪽으로 확장하지 않습니다. | 윈 토토 전략 1 |
| 윈 토토 전략 5 | 연산자 오른쪽 | 윈 토토 전략 2 |
| 윈 토토 전략 6, 18 | 동일 또는 동일 연산자 | 윈 토토 전략 7 |
| 윈 토토 전략 7, 16, 24, 25 | 연산자 포함 또는 같음 | |
| 윈 토토 전략 8, 26, 27 | 연산자 is-contained-by-or-equal-to | 윈 토토 전략 3 |
| 윈 토토 전략 9 | 연산자는 위로 확장하지 않습니다. | 윈 토토 전략 11 |
| 윈 토토 전략 10 | 연산자는 아래입니다 | 윈 토토 전략 12 |
| 윈 토토 전략 11 | 연산자는 위입니다 | 윈 토토 전략 9 |
| 윈 토토 전략 12 | 연산자는 아래로 확장되지 않습니다 | 윈 토토 전략 10 |
| 윈 토토 전략 20 | 연산자보다 작음 | 윈 토토 전략 5 |
| 윈 토토 전략 21 | 작거나 같음 연산자 | 윈 토토 전략 5 |
| 윈 토토 전략 22 | 보다 큰 연산자 | 윈 토토 전략 1 |
| 윈 토토 전략 23 | 보다 크거나 같음 연산자 | 윈 토토 전략 1 |
지원 함수 번호 1부터 10까지는 BRIN 내부 함수용으로 예약되어 있으므로 SQL 수준 함수는 번호 11부터 시작합니다. 지원 함수 번호 11은 인덱스를 구축하는 데 필요한 주요 함수입니다. 연산자 클래스와 동일한 데이터 유형을 가진 두 개의 인수를 허용하고 이들의 합집합을 반환해야 합니다. 포함 연산자 클래스는로 정의된 경우 다양한 데이터 유형의 공용체 값을 저장할 수 있습니다.저장매개변수. 통합 함수의 반환 값은 다음과 일치해야 합니다.저장데이터 유형.
지원 함수 번호 12 및 14는 내장 데이터 유형의 불규칙성을 지원하기 위해 제공됩니다. 기능 번호 12는 병합할 수 없는 다른 계열의 네트워크 주소를 지원하는 데 사용됩니다. 함수 번호 14는 빈 범위를 지원하는 데 사용됩니다. 함수 번호 13은 선택 사항이지만 권장되는 값으로, 통합 함수에 전달되기 전에 새 값을 확인할 수 있습니다. BRIN 프레임워크는 통합이 변경되지 않은 경우 일부 작업을 단축할 수 있으므로 이 기능을 사용하면 색인 성능이 향상될 수 있습니다.
항등 연산자만 구현하고 해싱을 지원하는 데이터 유형에 대한 연산자 클래스를 작성하려면 다음과 같이 해당 연산자와 함께 블룸 지원 절차를 사용할 수 있습니다.표 64.7. 모든 연산자 클래스 멤버(프로시저 및 연산자)는 필수입니다.
표 64.7. Bloom 연산자 클래스에 대한 절차 및 지원 번호
| 윈 토토 클래스 구성원 | 개체 |
|---|---|
| 지원 절차 1 | 내부 함수brin_bloom_opcinfo() |
| 지원 절차 2 | 내부 함수brin_bloom_add_value() |
| 지원 절차 3 | 내부 함수brin_bloom_conpersist() |
| 지원 절차 4 | 내부 함수brin_bloom_union() |
| 지원 절차 5 | 내부 함수brin_bloom_options() |
| 지원 절차 11 | 요소의 해시를 계산하는 함수 |
| 윈 토토 전략 1 | 연산자와 같음 |
지원 프로시저 번호 1-10은 BRIN 내부 함수용으로 예약되어 있으므로 SQL 수준 함수는 번호 11로 시작합니다. 지원 함수 번호 11은 인덱스를 구축하는 데 필요한 주요 기능입니다. 연산자 클래스와 동일한 데이터 유형을 가진 하나의 인수를 허용하고 값의 해시를 반환해야 합니다.
minmax-multi 연산자 클래스는 또한 완전히 정렬된 집합을 구현하는 데이터 유형을 위한 것이며 minmax 연산자 클래스의 간단한 확장으로 볼 수 있습니다. minmax 연산자 클래스는 각 블록 범위의 값을 단일 연속 간격으로 요약하는 반면, minmax-multi는 여러 개의 작은 간격으로 요약하여 이상값 처리를 개선합니다. 다음과 같이 해당 연산자와 함께 minmax-multi 지원 절차를 사용할 수 있습니다.표 64.8. 모든 연산자 클래스 멤버(프로시저 및 연산자)는 필수입니다.
표 64.8. minmax-multi 연산자 클래스에 대한 절차 및 지원 번호
| 오퍼레이터 클래스 멤버 | 개체 |
|---|---|
| 지원 절차 1 | 내부 함수brin_minmax_multi_opcinfo() |
| 지원 절차 2 | 내부 함수brin_minmax_multi_add_value() |
| 지원 절차 3 | 내부 함수brin_minmax_multi_condependent() |
| 지원 절차 4 | 내부 함수brin_minmax_multi_union() |
| 지원 절차 5 | 내부 함수brin_minmax_multi_options() |
| 지원 절차 11 | 두 값 사이의 거리를 계산하는 함수(범위의 길이) |
| 윈 토토 전략 1 | 연산자보다 작음 |
| 윈 토토 전략 2 | 작거나 같음 연산자 |
| 윈 토토 전략 3 | 연산자와 같음 |
| 윈 토토 전략 4 | 보다 크거나 같음 연산자 |
| 윈 토토 전략 5 | 보다 큰 연산자 |
minmax 및 포함 연산자 클래스는 모두 교차 데이터 유형 연산자를 지원하지만 이러한 연산자를 사용하면 종속성이 더욱 복잡해집니다. minmax 연산자 클래스에는 동일한 데이터 유형을 갖는 두 인수를 사용하여 정의할 전체 연산자 세트가 필요합니다. 추가 연산자 세트를 정의하여 추가 데이터 유형을 지원할 수 있습니다. 포함 연산자 클래스 연산자 전략은 다음과 같이 다른 연산자 전략에 종속됩니다.표 64.6, 또는 자신과 동일한 연산자 전략. 종속성 연산자를로 정의해야 합니다.저장데이터 유형을 왼쪽 인수로 사용하고 다른 지원되는 데이터 유형을 지원되는 연산자의 오른쪽 인수로 사용합니다. 참조float4_minmax_ops최소최대의 예로서, 그리고box_inclusion_ops포함의 예입니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.