개발 버전 :Devel
지원되지 않는 버전 :12 / 11 / 10 / 9.6 / 9.5 / 9.4 / 9.3 / 9.2 / 9.1 / 9.0 / 8.4 / 8.3 / 8.2

64.4. 진 토토 캔#

64.4.1. 소개#

일반화 된 거꾸로 된 토토 캔를 나타냅니다.는 인덱싱 할 항목이 복합 값인 핸들링 케이스를 위해 설계되었으며 토토 캔로 처리 할 쿼리는 복합 항목 내에 나타나는 요소 값을 검색해야합니다. 예를 들어, 항목은 문서 일 수 있으며 쿼리는 특정 단어가 포함 된 문서를 검색 할 수 있습니다.

우리는 단어를 사용합니다항목색인화 될 복합 값을 참조하고 단어요소 값을 참조하려면항상 항목 값이 아닌 키를 저장하고 검색합니다.

A 색인은 (키, 게시 목록) 쌍 세트를 저장합니다.게시 목록는 키가 발생하는 행 ID 세트입니다. 항목에 둘 이상의 키를 포함 할 수 있으므로 동일한 행 ID가 여러 게시 목록에 나타날 수 있습니다.동일한 키가 여러 번 나타나는 경우 토토 캔가 매우 작습니다.

액세스 방법 코드는 가속화되는 특정 작업을 알 필요가 없습니다. 대신 특정 데이터 유형에 정의 된 사용자 정의 전략을 사용합니다.

하나의 이점는 데이터베이스 전문가가 아닌 데이터 유형의 도메인 전문가가 적절한 액세스 방법을 사용하여 사용자 정의 데이터 유형을 개발할 수 있다는 것입니다. 이것은 사용과 거의 같은 이점입니다.gist.

the구현PostgreSQL는 주로 Teodor Sigaev와 Oleg Bartunov에 의해 유지됩니다. 에 대한 자세한 정보가 있습니다.on웹 사이트.

64.4.2. 내장 운영자 클래스#

핵심PostgreSQL분포 포함운영자 클래스에 표시표 64.3. (일부 선택 모듈 중 일부는PostgreSQL : 문서 : 17 : 부록 F. 추가 제공된 모듈 및 스포츠 토토 베트맨추가 제공운영자 클래스.)

표 64.3. 내장운영자 클래스

이름 토토 캔 가능한 연산자
array_ops && (AnyArray, AnyArray)
@> (AnyArray, AnyArray)
<@ (AnyArray, AnyArray)
= (AnyArray, AnyArray)
JSONB_OPS @> (JSONB, JSONB)
@? (JSONB, JSONPATH)
@@ (JSONB, JSONPATH)
? (JSONB, 텍스트)
? | (jsonb, text [])
? & (jsonb, text [])
JSONB_PATH_OPS @> (JSONB, JSONB)
@? (JSONB, JSONPATH)
@@ (JSONB, JSONPATH)
tsvector_ops @@ (tsvector, tsquery)

유형에 대한 두 연산자 클래스JSONB, JSONB_OPS기본값입니다.JSONB_PATH_OPS더 적은 운영자를 지원하지만 해당 연산자에게 더 나은 성능을 제공합니다. 보다섹션 8.14.4자세한 내용.

64.4.3. 확장 성#

the인터페이스에는 높은 수준의 추상화가있어 액세스 방법 구현자가 액세스하는 데이터 유형의 의미를 구현해야합니다. 그만큼레이어 자체는 동시성, 로깅 및 트리 구조 검색을 처리합니다.

a를 얻는 데 필요한 모든 것Access Method Working은 트리의 키의 동작과 키, 인덱스 항목 및 인덱스 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 메소드를 구현하는 것입니다. 요컨대확장 성과 일반성, 코드 재사용 및 깨끗한 인터페이스를 결합합니다.

운영자가 클래스하는 두 가지 방법이 있습니다제공해야합니다 :

Datum *ExtractValue (Datum itemvalue, int32 *nkeys, bool ** nullflags)

인덱스 할 항목이 주어진 주어진 키를 반환합니다. 반환 된 키의 수는에 저장되어야합니다.*nkeys. 키가 null 일 수 있다면 Palloc a array*nkeys bool필드, 주소를 저장*nullflags,이 널 플래그를 필요에 따라 설정하십시오.*nullflags남겨질 수 있습니다NULL(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.NULL항목에 키가 포함되어 있지 않은 경우.

Datum *ExtractQuery (Datum Query, Int32 *Nkeys, StrategyNumber N, BOOL ** PMATCH, 포인터 ** extra_data, bool ** nullflags, int32 *searchmode)

쿼리 할 값이 주어진 Palloc'd Keys를 반환합니다. 즉,쿼리왼쪽이 색인화 된 열인 토토 캔 가능한 연산자의 오른쪽에있는 값입니다.n운영자 클래스 내 운영자의 전략 번호입니다 (참조섹션 36.16.2). 자주,ExtractQuery상담해야합니다n데이터 유형을 결정하려면쿼리및 주요 값을 추출하는 데 사용해야하는 메소드. 반환 된 키의 수는에 저장되어야합니다.*nkeys. 키가 null 일 수 있다면 Palloc a array*nkeys bool필드, 주소를 저장*nullflags,이 널 플래그를 필요에 따라 설정하십시오.*nullflags남겨질 수 있습니다NULL(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.NULL쿼리키가 포함되어 있습니다.

SearchMode허용하는 출력 인수입니다ExtractQuery검색 수행 방법에 대한 세부 정보를 지정합니다. 만약에*SearchMode15527_15536gin_search_mode_default(전화 전에 초기화 된 값), 반환 된 키 중 하나 이상 일치하는 항목 만 후보 일치로 간주됩니다. 만약에*SearchMode15527_15536gin_search_mode_include_empty, 그 다음 하나 이상의 일치 키가 포함 된 항목 외에도 키가 전혀없는 항목은 후보 일치로 간주됩니다. (이 모드는 예를 들어 IS 서브 세트 오퍼레이터를 구현하는 데 유용합니다.) if*SearchMode15527_15536gin_search_mode_all, 인덱스의 모든 널이 아닌 항목은 반환 된 키와 일치하는지 여부에 관계없이 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야하므로 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우이 모드가 필요한 연산자는 아마도 진 운영자 클래스를위한 좋은 후보가 아닐 것입니다.)이 모드를 설정하는 데 사용하는 기호는에 정의되어 있습니다.access/gin.h.

PMATCH부분 일치가 지원 될 때 사용하기위한 출력 인수입니다. 사용하려면ExtractQuery배열을 할당해야합니다*nkeys bools와 주소를 저장*PMATCH. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소가 true로 설정되어야합니다.*PMATCH15527_15536NULL그런 다음 진은 부분 일치가 필요하지 않다고 가정합니다. 변수가 초기화되어NULL19016_19122

extra_data허용하는 출력 인수입니다ExtractQuery추가 데이터를 전달하려면일관성and비교파방법. 사용하려면ExtractQuery배열을 할당해야합니다*nkeys포인터 및 주소를 보관하십시오.*엑스트라 _data, 그런 다음 원하는 것을 개별 포인터에 보관하십시오. 변수가 초기화되어NULL호출하기 전에이 인수는 추가 데이터가 필요하지 않은 운영자 클래스에서 단순히 무시할 수 있습니다. 만약에*엑스트라 _data설정되어 전체 배열이에 전달됩니다.일관성메소드 및 적절한 요소비교파메소드

운영자 클래스는 인덱스 된 항목이 쿼리와 일치하는지 확인하는 기능을 제공해야합니다. 그것은 두 가지 맛으로 온다, 부울일관성함수 및 3 대triconsistent기능.triconsistent두 기능을 다루므로 제공triconsistent혼자 충분합니다. 그러나 부울 변형이 계산하기가 상당히 저렴한 경우 둘 다를 제공하는 것이 유리할 수 있습니다.

bool 일관성 (Bool Check [], StrategyNumber N, Datum Query, Int32 Nkeys, Pointer extra_data [], bool *RECHECK, DATUM QUERYKEYS [], BOOL NULLFLAGS [])

인덱스 된 항목이 전략 번호로 쿼리 연산자를 만족하는 경우 true를 반환합니다n(또는 재확인 표시가 반환되는 경우이를 만족시킬 수도 있음). 이 기능은 이후로 인덱싱 된 항목의 값에 직접 액세스하지 못합니다.아이템을 명시 적으로 저장하지 않습니다. 오히려, 사용 가능한 것은 쿼리에서 추출한 주요 값이 주어진 인덱스 항목에 나타나는 지식입니다.check배열 길이nkeys, 이는 이전에 반환 된 키의 수와 동일합니다ExtractQuery이것쿼리Datum. 의 각 요소check인덱스 항목에 해당 쿼리 키가 포함 된 경우 배열이 사실입니다.ExtractQuery결과 배열은 인덱스 항목에 있습니다. 원래쿼리Datum은의 경우 통과됩니다일관성방법을 참조해야합니다.QueryKeys []andnullflags []이전에 반품 배열ExtractQuery. extra_dataExtra-Data 배열은입니다.ExtractQuery또는NULL없음.

언제ExtractQueryNULL 키를 반환QueryKeys [], 해당check []인덱스 항목에 null 키가 포함 된 경우 요소가 참입니다. 즉,의 의미론check []|. 그만큼일관성함수는 해당하는 것을 검사 할 수 있습니다nullflags []정기적 인 값 일치와 널 매치의 차이를 알려야 할 경우 요소

성공,*재전송24247_24485*재전송힙 튜플이 쿼리와 일치한다는 것을 허위로 설정합니다. 그리고의 진정한 반환 값*재전송true로 설정된 힙 튜플이 쿼리와 일치 할 수 있음을 의미하므로 원래 인덱스 항목에 대해 쿼리 연산자를 직접 평가하여 가져 와서 다시 확인해야합니다..

Ginternaryvalue triconsistent (Ginternaryvalue check [], StrategyNumber N, Datum Query, int32 nkeys, pointer extra_data [], datum querykeys [], bool nullflags [])

triconsistent|일관성, 그러나 부울 대신check벡터, 각 키에 대한 세 가지 가능한 값이 있습니다.gin_true, gin_falseandgin_maybe. gin_falseandgin_true일반 부울 값과 동일한 의미를 지니고gin_maybe는 해당 키의 존재가 알려져 있지 않음을 의미합니다. 언제gin_maybe값이 존재하고 함수는 반환해야합니다gin_true인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부에 관계없이 항목이 확실히 일치하는 경우. 마찬가지로 함수는 반환해야합니다gin_false항목이 확실히 일치하지 않는 경우에만gin_maybe키. 결과가에 의존하는 경우gin_maybe항목, 즉, 알려진 쿼리 키에 따라 일치를 확인하거나 반박 할 수 없으므로 함수는 반환해야합니다gin_maybe.

없을 때gin_maybecheck벡터, agin_maybereturn 값은 설정과 동일합니다Recheck부울의 깃발일관성기능.

또한 Gin은 토토 캔에 저장된 주요 값을 정렬 할 수있는 방법이 있어야합니다. 연산자 클래스는 비교 방법을 지정하여 정렬 순서를 정의 할 수 있습니다.

int 비교 (Datum A, Datum B)

두 개의 키를 비교하고 (색인 된 항목이 아님) 0, 0 또는 0보다 작은 정수를 반환하여 첫 번째 키가 두 번째 키보다 적은지 또는 크지 여부를 나타냅니다. 널 키는이 기능으로 전달되지 않습니다.

또는 운영자 클래스가 A를 제공하지 않는 경우비교메소드, Gin은 인덱스 키 데이터 유형에 대한 기본 BTREE 연산자 클래스를 찾아 비교 함수를 사용합니다. Btree 운영자 클래스를 찾는 데 몇주기가 비용이 들기 때문에 하나의 데이터 유형만을 의미하는 GIN 연산자 클래스에서 비교 함수를 지정하는 것이 좋습니다.array_ops) 일반적으로 단일 비교 함수를 지정할 수 없습니다.

운영자 클래스선택적으로 다음 방법을 제공 할 수 있습니다.

int comparePartial (Datum Partial_key, Datum Key, StrateghtNumber N, Pointer extra_data)

부분 매치 쿼리 키를 색인 키와 비교합니다. 부호가 결과를 나타내는 정수를 반환합니다. 0보다 작 으면 인덱스 키가 쿼리와 일치하지 않지만 인덱스 스캔이 계속되어야합니다.n부분 일치 쿼리를 생성 한 연산자의 스캔을 종료 할시기를 결정하기 위해 의미론이 필요합니다. 또한,extra_data|ExtractQuery또는NULL없음. 널 키는이 기능으로 전달되지 않습니다.

무효 옵션 (local_relopts *repopts)

운영자 클래스 동작을 제어하는 ​​사용자가 가시 가능한 매개 변수 세트를 정의합니다.

the옵션함수는 A에 포인터가 전달됩니다local_relopts구조물은 일련의 운영자 클래스 특정 옵션으로 채워야합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스 할 수 있습니다.pg_has_opclass_options ()andpg_get_opclass_options ()Macros.

토토 캔 값의 키 추출과 키의 표현이 모두 이후융통성이 있으므로 사용자 지정 매개 변수에 의존 할 수 있습니다.

지원하기부분 경기쿼리, 운영자 클래스는를 제공해야합니다.비교파메소드 및 그ExtractQuery메소드를 설정해야합니다PMATCH매개 변수 부분 매치 쿼리가 발생한 경우. 보다섹션 64.4.4.2자세한 내용.

다양한 데이터 유형Datum위에서 언급 한 값은 운영자 클래스에 따라 다릅니다. 항목 값이 전달되었습니다ExtractValue항상 운영자 클래스의 입력 유형이므로 모든 주요 값은 클래스의 여야합니다스토리지타입. 의 유형쿼리인수가 전달되었습니다ExtractQuery, 일관성andtriconsistent전략 번호로 식별 된 클래스 멤버 연산자의 오른쪽 입력 유형이 무엇이든. 올바른 유형의 주요 값을 추출 할 수있는 한 토토 캔 유형과 동일 할 필요는 없습니다.쿼리인수, 실제 유형이 연산자에 따라 다른 것일 수 있지만

64.4.4. 구현#

내부적으로 A색인에는 키를 통해 구성된 B- 트리 색인이 포함되어 있으며 각 키는 하나 이상의 색인 항목 (예 : 배열 구성원)의 요소이며 리프 페이지의 각 튜플이 힙 포인터의 B- 트리에 대한 포인터를 포함합니다 (A트리 게시) 또는 힙 포인터의 간단한 목록 (a게시 목록) 목록이 키 값과 함께 단일 토토 캔 튜플에 적합 할 정도로 작을 때.그림 64.1진 토토 캔의 이러한 구성 요소를 보여줍니다.

기준PostgreSQL9.1, 널 키 값이 색인에 포함될 수 있습니다. 또한 자리 표시 자 널은 널 또는 키가 포함 된 인덱스 품목에 대한 색인에 포함되어 있습니다.ExtractValue. 이를 통해 빈 항목을 찾을 수있는 검색이 가능합니다.

멀티 컬럼인덱스는 복합 값 (열 번호, 키 값)을 통해 단일 B- 트리를 구축하여 구현됩니다. 다른 열의 핵심 값은 다른 유형 일 수 있습니다.

그림 64.1. 진부


64.4.4.1. 진 빠른 업데이트 기술#

a반전 인덱스의 본질적인 특성으로 인해 인덱스가 느려지는 경향이 있습니다. 하나의 힙 행을 삽입하거나 업데이트하면 많은 인서트가 인덱스에 많은 인서트를 유발할 수 있습니다 (색인 항목에서 추출한 각 키마다 하나)..| 새로운 튜플을 임시로 분류되지 않은 보류 항목 목록에 삽입 하여이 작업의 많은 부분을 연기 할 수 있습니다. 테이블이 진공 청소기 또는자가 분석 할 때 또는gin_clean_pending_list함수가 호출되거나 보류중인 목록이보다 커지는 경우gin_pending_list_limit, 항목이 메인으로 이동초기 인덱스 생성 중에 사용되는 동일한 벌크 삽입 기술을 사용한 데이터 구조. 이것은 크게 향상됩니다인덱스 업데이트 속도, 추가 진공 오버 헤드를 계산합니다. 또한 오버 헤드 작업은 전경 쿼리 처리 대신 백그라운드 프로세스로 수행 할 수 있습니다.

이 접근법의 주요 단점은 검색이 일반 색인을 검색하는 것 외에도 보류중인 항목 목록을 스캔해야하므로 대규모 보류 항목 목록에서 검색이 크게 느려집니다. 또 다른 단점은 대부분의 업데이트가 빠르지 만 보류중인 목록이되게하는 업데이트입니다.너무 큰즉시 청소주기가 발생하므로 다른 업데이트보다 훨씬 느려집니다. Autovacuum을 올바르게 사용하면이 두 가지 문제를 모두 최소화 할 수 있습니다.

일관된 응답 시간이 업데이트 속도보다 더 중요한 경우, 보류중인 항목을 사용하여 꺼져서 비활성화 할 수 있습니다Fastupdatea 스토리지 매개 변수색인. 보다색인 생성자세한 내용.

64.4.4.2. 부분 매치 알고리즘#

진은 지원할 수 있습니다부분 경기쿼리가 하나 이상의 키와 정확히 일치하지 않지만 가능한 일치는 합리적으로 좁은 범위의 키 값에 속합니다 (비교지원 방법). 그만큼ExtractQuery메소드는 정확히 일치 할 키 값을 반환하는 대신 검색 할 범위의 하한 인 키 값을 반환하고를 설정합니다.PMATCH플래그 참. 그런 다음 키 범위가를 사용하여 스캔됩니다.비교파메소드비교파일치하는 토토 캔 키의 경우 0을 반환해야합니다. 검색 할 범위 내에있는 비 일치의 경우 0보다 적거나 토토 캔 키가 일치 할 수있는 범위를 지나면 0보다 큰 경우 0보다 적습니다..

64.4.5. 진 팁과 요령#

생성 대 삽입

a각 항목에 대해 많은 키를 삽입 할 가능성으로 인해 인덱스가 느려질 수 있습니다. 따라서 대량 삽입을 테이블에 삽입하려면 GIN 지수를 삭제하고 벌크 삽입을 마친 후 재현하는 것이 좋습니다.

언제Fastupdate(참조섹션 64.4.4.1자세한 내용), 페널티는 그렇지 않은 경우보다 적습니다. 그러나 매우 큰 업데이트의 경우 여전히 색인을 삭제하고 재현하는 것이 가장 좋습니다.

maintenance_work_mem

A 빌드 시간색인은에 매우 민감합니다maintenance_work_mem설정; 토토 캔 생성 중에 작업 메모리에 대해 Skimp에게 비용을 지불하지 않습니다.

gin_pending_list_limit

기존에 일련의 삽입 중Fastupdate활성화 된 경우, 시스템은 목록이 더 커질 때마다gin_pending_list_limit. 관찰 된 응답 시간의 변동을 피하려면 백그라운드에서 보류중인 목록 정리가 발생하는 것이 바람직합니다 (즉, Autovacuum을 통해).gin_pending_list_limit또는 Autovacuum을보다 공격적으로 만듭니다. 그러나 정리 작업의 임계 값을 확대하면 전경 정리가 발생하면 더 오래 걸릴 것입니다.

gin_pending_list_limit스토리지 매개 변수를 변경하여 개별 GIN 인덱스에 대해 재정의 할 수 있으며,이를 통해 각 GIN 인덱스는 자체 정리 임계 값을 가질 수 있습니다. 예를 들어, 진 인덱스에 대해서만 임계 값을 높이고 다른 방법으로 줄일 수 있습니다.

gin_fuzzy_search_limit

개발의 주요 목표인덱스는 고도로 확장 가능한 전체 텍스트 검색을 지원하는 것이PostgreSQL, 그리고 전체 텍스트 검색에서 매우 큰 결과를 반환하는 상황이 종종 있습니다. 또한 이는 쿼리에 매우 빈번한 단어가 포함되어있을 때 종종 발생하므로 큰 결과 세트가 유용하지 않습니다.

그러한 쿼리의 통제 된 실행을 용이하게하려면반환 된 행 수에 대한 구성 가능한 소프트 상한이 있습니다.gin_fuzzy_search_limit구성 매개 변수. 기본적으로 0으로 설정됩니다 (제한 없음).

소프트쿼리와 시스템의 랜덤 번호 생성기의 품질에 따라 실제 반환 된 결과 수가 지정된 한계와 다소 다를 수 있음을 의미합니다.

경험에서 얻은 수천 (예 : 5000 - 20000)의 가치가 잘 작동합니다.

64.4.6. 제한#

토토 캔 가능한 연산자가 엄격하다고 가정합니다. 이것은ExtractValueNULL 항목 값으로 전혀 호출되지 않습니다 (대신 자리 표시 자 인덱스 항목이 자동으로 생성 됨) 및.ExtractQueryNULL 쿼리 값으로 호출되지 않습니다 (대신 쿼리는 불만족으로 추정됩니다). 그러나 NULL 복합재 항목 또는 쿼리 값에 포함 된 NULL 키 값이 지원됩니다.

64.4.7. 예#

핵심PostgreSQL분포 포함이전에 표시된 운영자 클래스표 64.3. 다음Contrib모듈도 포함운영자 클래스 :

btree_gin

여러 데이터 유형에 대한 B- 트리 동등한 기능

hstore

저장을위한 모듈 (키, 값) pairs

intarray

향상된 지원int []

PG_TRGM

Trigram 매칭을 사용한 텍스트 유사성

정정 제출

문서에 올바른 것이 없으면 일치하지 않습니다.이 양식문서 문제를보고하려면