진일반화 된 거꾸로 된 색인을 나타냅니다.진는 인덱싱 할 항목이 복합 값인 핸들링 케이스를 위해 설계되었으며 토토 캔로 처리 해야하는 쿼리는 복합 항목 내에 나타나는 요소 값을 검색해야합니다. 예를 들어, 항목은 문서 일 수 있으며 쿼리는 특정 단어가 포함 된 문서를 검색 할 수 있습니다.
우리는 단어를 사용합니다항목색인화 될 복합 값을 참조하려면, 단어키요소 값을 참조하려면진항상 항목 값이 아닌 키를 저장하고 검색합니다.
a진색인은 (키, 게시 목록) 쌍 세트를 저장합니다.게시 목록는 키가 발생하는 행 ID 세트입니다. 항목에 둘 이상의 키를 포함 할 수 있으므로 동일한 행 ID가 여러 게시 목록에 나타날 수 있습니다. 각 키 값은 한 번만 저장되므로 A진동일한 키가 여러 번 나타나는 경우 토토 캔가 매우 작습니다.
진진액세스 방법 코드는 가속화되는 특정 작업을 알 필요가 없습니다. 대신 특정 데이터 유형에 정의 된 사용자 정의 전략을 사용합니다. 이 전략은 인덱스 항목 및 쿼리 조건에서 키를 추출하는 방법과 쿼리에 주요 값을 포함하는 행이 실제로 쿼리를 만족시키는 지 여부를 결정하는 방법을 정의합니다..
하나의 이점진데이터베이스 전문가가 아닌 데이터 유형의 도메인 전문가가 적절한 액세스 방법을 사용하여 사용자 정의 데이터 유형을 개발할 수 있습니다. 이것은 사용과 거의 같은 이점입니다.gist.
the진구현PostgreSQL는 주로 Teodor Sigaev와 Oleg Bartunov에 의해 유지됩니다. 에 대한 자세한 정보가 있습니다.진on웹 사이트.
핵심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자세한 내용.
thegin인터페이스는 높은 수준의 추상화를 가지고있어 액세스 방법 구현자가 액세스하는 데이터 유형의 의미를 구현해야합니다. 그만큼16726_16731레이어 자체는 동시성, 로깅 및 트리 구조 검색을 처리합니다.
a를 얻는 데 필요한 모든 것진Access Method Working은 트리의 키의 동작과 키, 인덱스 항목 및 인덱스 가능한 쿼리 간의 관계를 정의하는 몇 가지 사용자 정의 메소드를 구현하는 것입니다. 요컨대진확장 성과 일반성, 코드 재사용 및 깨끗한 인터페이스를 결합합니다.
운영자가 클래스하는 두 가지 방법이 있습니다진제공해야합니다 :
Datum *ExtractValue (Datum itemvalue, int32 *nkeys, bool ** nullflags)
인덱스 할 항목이 주어진 Palloc'd Keys를 반환합니다. 반환 된 키의 수는에 저장되어야합니다.*nkeys
. 키가 null 일 수 있다면 Palloc a array*nkeys
bool
필드, 주소를 보관하십시오.*nullflags
,이 널 플래그를 필요에 따라 설정하십시오.*nullflags
남겨질 수 있습니다null
(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.null
항목에 키가 포함되어 있지 않은 경우.
Datum *ExtractQuery (Datum Query, int32 *nkeys, Strategptionnumber N, Bool ** PMATCH, 포인터 ** extra_data, bool ** nullflags, int32 *searchmode)
쿼리 할 값이 주어진 Palloc'd Keys를 반환합니다. 즉,쿼리
왼쪽이 색인화 된 열인 토토 캔 가능한 연산자의 오른쪽에있는 값입니다.n
운영자 클래스 내 운영자의 전략 번호입니다 (참조섹션 36.16.2). 자주,ExtractQuery
상담해야합니다n
데이터 유형을 결정하려면Query
및 주요 값을 추출하는 데 사용해야하는 메소드. 반환 된 키의 수는에 저장되어야합니다.*nkeys
. 키가 null 일 수 있다면 Palloc a array*nkeys
bool
필드, 주소를 저장*nullflags
,이 널 플래그를 필요에 따라 설정하십시오.*nullflags
남겨질 수 있습니다NULL
(초기 값) 모든 키가 null이 아닌 경우. 반환 값은입니다.NULL
쿼리
키가 포함되어 있습니다.
SearchMode
허용하는 출력 인수입니다ExtractQuery
검색 수행 방법에 대한 세부 정보를 지정합니다. 만약에*SearchMode
로 설정되었습니다gin_search_mode_default
(전화 전에 초기화 된 값), 반환 된 키 중 하나 이상 일치하는 항목 만 후보 일치로 간주됩니다. 만약에*SearchMode
로 설정되었습니다gin_search_mode_include_empty
, 그 다음 하나 이상의 일치 키가 포함 된 항목 외에도 키가 전혀없는 항목은 후보 일치로 간주됩니다. (이 모드는 예를 들어 IS 서브 세트 오퍼레이터를 구현하는 데 유용합니다.) if*SearchMode
로 설정되었습니다gin_search_mode_all
, 인덱스의 모든 비 널 항목은 반환 된 키와 일치하는지 여부에 관계없이 후보 일치로 간주됩니다. (이 모드는 본질적으로 전체 인덱스를 스캔해야하므로 다른 두 가지 선택보다 훨씬 느립니다. 그러나 코너 케이스를 올바르게 구현해야 할 수도 있습니다. 대부분의 경우이 모드가 필요한 연산자는 아마도 진 운영자 클래스를위한 좋은 후보가 아닐 것입니다.)이 모드를 설정하는 데 사용하는 기호는에 정의되어 있습니다.access/gin.h
.
PMATCH
부분 일치가 지원 될 때 사용하기위한 출력 인수입니다. 사용하려면ExtractQuery
배열을 할당해야합니다*nkeys
bool
s와 주소를 보관하십시오.*PMATCH
. 해당 키에 부분 일치가 필요한 경우 배열의 각 요소가 true로 설정되어야합니다. 만약에*pmatch
로 설정되었습니다NULL
그런 다음 진은 부분 일치가 필요하지 않다고 가정합니다. 변수가 초기화되어null
전화하기 전에,이 인수는 부분 일치를 지원하지 않는 운영자 클래스에서 단순히 무시할 수 있습니다.
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
this쿼리
Datum. 의 각 요소check
인덱스 항목에 해당 쿼리 키가 포함 된 경우 배열이 사실입니다.ExtractQuery
결과 배열은 인덱스 항목에 있습니다. 원래쿼리
Datum은 |일관성
방법을 참조해야합니다.QueryKeys []
andnullflags []
이전에 반품 배열ExtractQuery
. extra_data
Extra-Data 배열은입니다.ExtractQuery
또는null
없음.
언제ExtractQuery
NULL 키를 반환합니다QueryKeys []
, 해당check []
인덱스 항목에 null 키가 포함 된 경우 요소가 참입니다. 즉,의 의미론check []
. 그만큼
일관성
함수는 해당하는 것을 검사 할 수 있습니다nullflags []
정기적 인 값 일치와 널 매치의 차이를 알려야 할 경우 요소
성공,*재확인
25739_25981*재전송
힙 튜플이 쿼리와 일치한다는 것을 허위로 설정합니다. 그리고의 진정한 반환 값*재확인
True로 설정된 힙 튜플이 쿼리와 일치 할 수 있음을 의미하므로 원래 인덱스 항목에 대해 쿼리 연산자를 직접 평가하여 가져 와서 다시 확인해야합니다..
GinternaryValue triconsistent (Ginternaryvalue Check [], StrategyNumber N, Datum Query, Int32 NKeys, Pointer extra_data [], Datum QueryKeys [], bool nullflags [])
triconsistent
일관성
, 그러나 부울 대신check
벡터, 각 키에 대한 세 가지 가능한 값이 있습니다.gin_true
, gin_false
andgin_maybe
. gin_false
andgin_true
일반 부울 값과 동일한 의미를 지니고gin_maybe
는 해당 키의 존재가 알려져 있지 않음을 의미합니다. 언제gin_maybe
값이 존재하고 함수는 반환해야합니다gin_true
인덱스 항목에 해당 쿼리 키가 포함되어 있는지 여부에 관계없이 항목이 확실히 일치하는 경우. 마찬가지로 함수는 반환해야합니다gin_false
항목이 확실히 일치하지 않는 경우에만gin_maybe
키. 결과가에 의존하는 경우gin_maybe
항목, 즉, 알려진 쿼리 키에 따라 일치를 확인하거나 반박 할 수 없으므로 함수는 반환해야합니다gin_maybe
.
없을 때gin_maybe
값check
벡터, agin_maybe
return 값은 설정과 동일합니다다시 확인
부울의 깃발일관성
기능.
또한 Gin은 토토 캔에 저장된 주요 값을 정렬 할 수있는 방법이 있어야합니다. 연산자 클래스는 비교 방법을 지정하여 정렬 순서를 정의 할 수 있습니다.
int 비교 (Datum A, Datum B)
두 개의 키를 비교하고 (색인 된 항목이 아님) 0, 0 또는 0보다 작은 정수를 반환하여 첫 번째 키가 두 번째 키보다 적은지 또는 크지 여부를 나타냅니다. 널 키는이 기능으로 전달되지 않습니다.
대안 적으로, 운영자 클래스가 a를 제공하지 않으면비교
메소드, Gin은 인덱스 키 데이터 유형에 대한 기본 BTREE 연산자 클래스를 찾아 비교 함수를 사용합니다. Btree 운영자 클래스를 찾는 데 몇주기가 비용이 들기 때문에 하나의 데이터 유형만을 의미하는 GIN 연산자 클래스에서 비교 함수를 지정하는 것이 좋습니다. 그러나 다형성 진 운영자 클래스 (예 :array_ops
) 일반적으로 단일 비교 함수를 지정할 수 없습니다.
운영자 클래스gin선택적으로 다음 방법을 제공 할 수 있습니다.
int comparePartial (Datum partial_key, Datum Key, StrategyNumber N, Pointer extrac_data)
부분-매치 쿼리 키를 색인 키로 비교합니다. 부호가 결과를 나타내는 정수를 반환합니다. 0보다 작 으면 인덱스 키가 쿼리와 일치하지 않지만 인덱스 스캔이 계속되어야합니다. 0은 인덱스 키가 쿼리와 일치 함을 의미합니다. 0보다 큰 것은 더 이상 일치 할 수 없기 때문에 인덱스 스캔이 중지되어야 함을 나타냅니다. 전략 번호n
부분 일치 쿼리를 생성 한 연산자의 스캔을 종료 할시기를 결정하기 위해 의미론이 필요합니다. 또한,extra_data
ExtractQuery
또는null
없음. 널 키는이 기능으로 전달되지 않습니다.
무효 옵션 (local_relopts *repopts)
운영자 클래스 동작을 제어하는 사용자가 가시 가능한 매개 변수 세트를 정의합니다.
the옵션
함수는 A로 포인터가 전달됩니다local_relopts
구조물은 일련의 운영자 클래스 특정 옵션으로 채워야합니다. 옵션은를 사용하여 다른 지원 기능에서 액세스 할 수 있습니다.pg_has_opclass_options ()
andpg_get_opclass_options ()
매크로
토토 캔 값의 키 추출과 키의 표현 이후진융통성이 있으며 사용자 지정 매개 변수에 의존 할 수 있습니다.
지원하기“부분 경기”쿼리, 운영자 클래스가 제공해야합니다비교 상점
메소드 및 그ExtractQuery
메소드를 설정해야합니다PMATCH
매개 변수 부분 매치 쿼리가 발생한 경우. 보다섹션 64.4.4.2자세한 내용.
다양한 데이터 유형Datum
위에서 언급 한 값은 운영자 클래스에 따라 다릅니다. 항목 값이 전달되었습니다ExtractValue
항상 운영자 클래스의 입력 유형이므로 모든 주요 값은 클래스의 여야합니다스토리지
타입. 의 유형쿼리
인수가 전달되었습니다ExtractQuery
, 일관성
andtriconsistent
전략 번호로 식별 된 클래스 멤버 연산자의 오른쪽 입력 유형이 무엇이든. 올바른 유형의 주요 값을 추출 할 수있는 한 토토 캔 유형과 동일 할 필요는 없습니다. 그러나이 세 가지 지원 기능의 SQL 선언은에 OPCLASS의 토토 캔 데이터 유형을 사용하는 것이 좋습니다.쿼리
인수, 실제 유형이 연산자에 따라 다른 것일 수 있지만
내부적으로 A진인덱스는 키를 통해 구성된 B- 트리 색인이 포함되어 있으며, 각 키는 하나 이상의 색인 항목 (예 : 배열 구성원)의 요소이며 리프 페이지의 각 튜플이 heap 포인터의 B- 트리에 대한 포인터를 포함하는 곳에 있습니다 (A.“트리 게시”) 또는 간단한 힙 포인터 목록 (a“게시 목록”) 목록이 키 값과 함께 단일 토토 캔 튜플에 맞을 정도로 작을 때.그림 64.1진 토토 캔의 이러한 구성 요소를 보여줍니다.
PostgreSQL9.1, 널 키 값이 색인에 포함될 수 있습니다. 또한 자리 표시 자 널은 널 또는 키가 포함 된 인덱스 품목에 대한 색인에 포함되어 있습니다.ExtractValue
. 이를 통해 빈 항목을 찾을 수있는 검색이 가능합니다.
멀티 컬럼gin인덱스는 복합 값 (열 번호, 키 값)을 통해 단일 B- 트리를 구축하여 구현됩니다. 다른 열의 핵심 값은 다른 유형 일 수 있습니다.
그림 64.1. 진부
업데이트gin반전 인덱스의 본질적인 특성으로 인해 인덱스가 느려지는 경향이 있습니다. 하나의 힙 행을 삽입하거나 업데이트하면 많은 인서트가 인덱스에 삽입 될 수 있습니다 (색인 된 항목에서 추출 된 각 키마다 하나)..진| 새로운 튜플을 임시로 분류되지 않은 보류 항목 목록에 삽입 하여이 작업의 많은 부분을 연기 할 수 있습니다. 테이블이 진공 청소기 또는자가 분석 할 때 또는gin_clean_pending_list
함수가 호출되거나 보류중인 목록이보다 커지는 경우gin_pending_list_limit, 항목이 메인으로 이동gin초기 토토 캔 생성 중에 사용되는 동일한 벌크 삽입 기술을 사용한 데이터 구조. 이것은 크게 향상됩니다진인덱스 업데이트 속도, 추가 진공 오버 헤드를 계산하기도합니다. 또한 오버 헤드 작업은 전경 쿼리 처리 대신 백그라운드 프로세스로 수행 할 수 있습니다.
이 접근법의 주요 단점은 검색이 일반 색인을 검색하는 것 외에도 보류중인 항목 목록을 스캔해야하므로 대규모 보류 항목 목록에서 검색이 크게 느려집니다. 또 다른 단점은 대부분의 업데이트가 빠르지 만 보류중인 목록이되게하는 업데이트입니다.“너무 큰”즉시 정리주기가 발생하므로 다른 업데이트보다 훨씬 느려집니다. Autovacuum을 올바르게 사용하면이 두 가지 문제를 모두 최소화 할 수 있습니다.
일관된 응답 시간이 업데이트 속도보다 더 중요한 경우 보류중인 항목의 사용을 끄면 비활성화 할 수 있습니다Fastupdate
a 스토리지 매개 변수gin색인. 보다색인 생성자세한 내용.
진은 지원할 수 있습니다“부분 경기”쿼리가 하나 이상의 키와 정확히 일치하지 않지만 가능한 일치는 합리적으로 좁은 키 값 범위 (에 의해 결정된 키 분류 순서 내에서에 해당합니다.비교
지원 방법). 그만큼ExtractQuery
메소드는 정확히 일치 할 키 값을 반환하는 대신 검색 할 범위의 하한 범위 인 키 값을 반환하고를 설정합니다.PMATCH
플래그 참. 그런 다음 키 범위가를 사용하여 스캔됩니다.비교 상점
메소드비교 상점
일치하는 토토 캔 키의 경우 0을 반환해야합니다. 검색 할 범위 내에있는 비 일치의 경우 0보다 작은 경우, 토토 캔 키가 일치 할 수있는 범위를 지나면 0보다 큰 0보다 적습니다..
agin각 항목에 대해 많은 키를 삽입 할 가능성으로 인해 인덱스가 느려질 수 있습니다. 따라서 대량 삽입을 테이블에 삽입하려면 GIN 지수를 삭제하고 벌크 삽입을 마친 후 재현하는 것이 좋습니다.
언제Fastupdate
gin(참조섹션 64.4.4.1자세한 내용은 페널티가 그렇지 않은 경우보다 적습니다. 그러나 매우 큰 업데이트의 경우 여전히 색인을 삭제하고 재현하는 것이 가장 좋습니다.
A 빌드 시간gin색인은에 매우 민감합니다maintenance_work_mem
설정; 토토 캔 생성 중에 작업 메모리에 대해 Skimp에게 비용을 지불하지 않습니다.
기존에 일련의 삽입 중진Fastupdate
활성화 된 경우, 시스템은 목록이 더 커질 때마다gin_pending_list_limit
. 관찰 된 응답 시간의 변동을 피하려면 백그라운드에서 보류중인 목록 정리가 발생하는 것이 바람직합니다 (즉, Autovacuum을 통해). 전경 청소 작업은 증가하여 피할 수 있습니다gin_pending_list_limit
또는 Autovacuum을보다 공격적으로 만듭니다. 그러나 정리 작업의 임계 값을 확대하면 전경 정리가 발생하면 더 오래 걸릴 것입니다.
gin_pending_list_limit
스토리지 매개 변수를 변경하여 개별 성인 인덱스에 대해 재정의 할 수 있으며, 이는 각 진 인덱스에 자체 정리 임계 값을 가질 수 있습니다. 예를 들어, 진 인덱스에 대해서만 임계 값을 높이고 다른 방법으로 줄일 수 있습니다.
개발의 주요 목표gin토토 캔는 고도로 확장 가능한 전체 텍스트 검색을 지원하는 것이PostgreSQL, 그리고 전체 텍스트 검색이 매우 큰 결과 세트를 반환하는 상황이 종종 있습니다. 또한, 이것은 쿼리에 매우 빈번한 단어가 포함되어있을 때 종종 발생하므로 큰 결과 세트가 유용하지 않습니다. 디스크에서 많은 튜플을 읽고 분류하는 데 많은 시간이 걸릴 수 있으므로 생산에는 용납 할 수 없습니다. (인덱스 검색 자체가 매우 빠릅니다.)
그러한 쿼리의 통제 된 실행을 용이하게하려면gin반환 된 행 수에 대한 구성 가능한 소프트 상한이 있습니다.gin_fuzzy_search_limit
구성 매개 변수. 기본적으로 0으로 설정됩니다 (제한 없음). 0이 아닌 한계가 설정되면 리턴 된 세트는 무작위로 선택된 전체 결과 세트의 서브 세트입니다.
“소프트”쿼리와 시스템의 임의 번호 생성기의 품질에 따라 실제 반환 된 결과의 실제 수가 지정된 한계와 다소 다를 수 있음을 의미합니다.
경험에서 얻은 수천 (예 : 5000 - 20000)의 가치가 잘 작동합니다.
gin토토 캔 가능한 연산자가 엄격하다고 가정합니다. 이것은ExtractValue
NULL 항목 값으로 전혀 호출되지 않습니다 (대신 자리 표시 자 색인 항목이 자동으로 생성 됨) 및.ExtractQuery
NULL 쿼리 값으로 호출되지 않습니다 (대신 쿼리는 불만족으로 추정됩니다). 그러나 NULL 복합재 항목 또는 쿼리 값에 포함 된 NULL 키 값이 지원됩니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면