PostgreSQL표준 구현 포함btree(다중 웨이 균형 토토) 인덱스 데이터 구조. 잘 정의 된 선형 순서로 정렬 할 수있는 모든 데이터 유형은 BTREE 인덱스에 의해 인덱싱 될 수 있습니다. 유일한 제한은 인덱스 항목이 페이지의 약 1/3을 초과 할 수 없다는 것입니다 (해당되는 경우 토스트 압축 후).
각 btree 운영자 클래스는 데이터 유형에 정렬 순서를 부과하기 때문에 Btree 운영자 클래스 (또는 실제로 운영자 패밀리)는PostgreSQL의 정렬 의미에 대한 일반적인 표현 및 이해. 따라서 BTREE 지수를 지원하기 위해 필요한 것 이상의 기능과 BTREE와는 상당히 먼 시스템의 일부 기능을 얻었습니다.am그것들을 사용하십시오.
표 36.3, Btree 연산자 클래스는 5 개의 비교 연산자를 제공해야합니다.<
, <=
, =
, =
and. 하나는 그것을 기대할 수 있습니다
<
또한 운영자 클래스의 일부 여야하지만 A를 사용하는 것이 거의 유용하지 않기 때문에 그렇지 않습니다.<
인덱스 검색의 위치. (어떤 목적으로, 플래너는 취급<
btree 연산자 클래스와 관련된; 그러나 그것은를 통해 그 운영자를 발견합니다.=
운영자의 부정 자 링크가 아닌pg_amop
.)
몇 가지 데이터 유형이 거의 동일한 정렬 시맨틱을 공유하면 운영자 클래스를 운영자 제품군으로 그룹화 할 수 있습니다. 플래너가 교차 유형 비교에 대한 공제를 할 수 있기 때문에 그렇게하는 것은 유리합니다. 가족 내 각 운영자 클래스는 입력 데이터 유형에 대한 단일 유형 연산자 (및 관련 지원 기능)를 포함해야하며 크로스 유형 비교 연산자 및 지원 기능은입니다.“느슨한”가족. 전체 교차 유형 운영자 세트가 가족에 포함될 것을 권장합니다. 따라서 플래너가 전환으로부터 추론하는 비교 조건을 나타낼 수 있도록하는 것이 좋습니다..
Btree 운영자 가족이 만족해야한다는 몇 가지 기본 가정이 있습니다.
an=
운영자는 동등한 관계 여야합니다. 즉, 모든 널이 아닌 값에 대해a
, B
, C
데이터 유형의 :
a
=
a
true (반사법)
ifa
=
B
,B
=
a
(대칭 법)
ifa
=
B
andB
=
C
,a
=
C
(전이법)
a<
운영자는 강력한 순서 관계 여야합니다. 즉, 모든 널이 아닌 값에 대해a
, B
, C
:
a
<
a
is false (Irreflexive Law)
ifa
<
B
andB
<
C
, 그 다음a
<
C
(전이법)
또한 순서는 총입니다. 즉, 모든 널이 아닌 값에 대해a
, B
:
정확히 하나의a
<
B
, a
=
B
및B
<
a
is true (Trichotomy Law)
(Trichotomy 법은 비교 지원 기능의 정의를 정당화합니다.)
다른 세 연산자는의 관점에서 정의됩니다.=
and<
명백한 방식으로 그들과 일관되게 행동해야합니다.
여러 데이터 유형을 지원하는 운영자 패밀리의 경우 위의 법률은 언제 보유해야합니다a
, B
, C
가족의 모든 데이터 유형에서 가져옵니다. 교차 유형 상황에서 2 ~ 3 개의 다른 연산자의 행동이 일관성이 있다는 진술을 나타내는 전이 법률은 가장 까다로워집니다. 예를 들어, 그것은 작동하지 않을 것입니다float8
and숫자
동일한 운영자 제품군으로, 적어도 현재의 의미와는 달리숫자
값은로 변환됩니다.float8
A와 비교하려면float8
. 제한된 정확도 때문에float8
, 이것은 별개의 것이 있음을 의미합니다숫자
동일한 것과 동일하게 비교할 값float8
값, 따라서 전이법은 실패 할 것입니다.
다중 데이터 유형 패밀리에 대한 또 다른 요구 사항은 운영자 제품군에 포함 된 데이터 유형 사이에 정의 된 암시 적 또는 이진-조정 캐스트가 관련 정렬 순서를 변경해서는 안된다는 것입니다..
BTREE 지수가 단일 데이터 유형 내에서 이러한 법률을 요구하는 이유는 상당히 명확해야합니다. 또한 다른 데이터 유형의 비교 키를 사용한 인덱스 검색은 두 가지 데이터 유형에서 SANELY를 작동시키기 위해 비교해야합니다. 가족 내 3 개 이상의 데이터 유형에 대한 확장은 Btree Index 메커니즘 자체에 의해 엄격하게 요구되지 않지만 플래너는 최적화 목적으로 이들을 의존합니다..
표 36.9, Btree는 필요한 하나와 4 개의 선택적 지원 기능을 정의합니다. 5 가지 사용자 정의 방법은 다음과 같습니다.
Order
Btree 운영자 제품군이 비교 연산자에게 제공하는 데이터 유형의 각 조합에 대해, 등록 된 비교 지원 기능을 제공해야합니다PG_AMPROC
지원 기능 번호 1 및amproclefttype
/amprocrighttype
비교를 위해 왼쪽 및 오른쪽 데이터 유형과 동일합니다 (즉, 일치하는 연산자가 in에 등록되는 동일한 데이터 유형pg_amop
). 비교 함수는 두 개의 null 값을 취해야합니다a
andB
그리고 반환 anint32
그 값<
0
, 0
또는
0
언제a
<
B
, a
=
B
또는a
B
19008_19107src/backend/access/nbtree/nbtcompare.c
예제.
비교 값이 Collatable Data Type 인 경우 적절한 Collation OID가 표준을 사용하여 비교 지원 기능으로 전달됩니다pg_get_collation ()
메커니즘.
SortsUpport
선택적으로, Btree 운영자 가족이 제공 할 수 있습니다정렬 지원지원 기능 번호 2에 등록 된 함수. 이것에 관련된 API는에 정의됩니다.src/include/utils/sortsupport.h
.
in_Range
선택적으로 Btree 운영자 가족이 제공 할 수 있습니다in_Range지원 기능 기능 번호 3에 등록 된 지원 기능. BTREE 지수 작업 중에 사용되지 않습니다. 오히려, 그들은 운영자 가족의 의미를 확장하여을 포함하는 창 절을 지원할 수 있습니다.범위
오프셋
선행
and범위
오프셋
다음
프레임 바운드 유형 (참조섹션 4.2.8). 기본적으로 제공된 추가 정보는 AD를 추가하거나 빼는 방법입니다.오프셋
가족의 데이터 순서와 호환되는 방식으로 가치가 있습니다.
anin_Range
함수는 서명이 있어야합니다
in_Range (val
type1,base
type1,오프셋
Type2,sub
bool,Less
bool) 반품 bool
val
andBase
동일한 유형이어야합니다.이 유형은 운영자 제품군이 지원하는 유형 중 하나입니다 (즉, 주문을 제공하는 유형). 하지만,오프셋
다른 유형 일 수 있으며, 그렇지 않으면 가족이지지하지 않을 수 있습니다. 예를 들어 내장time_ops
가족 제공in_Range
오프셋
OF TYPE간격
. 가족이 제공 할 수 있습니다in_Range
지원되는 유형의 기능 및 하나 이상의 기능오프셋
유형. 각in_Range
함수를 입력해야합니다PG_AMPROC
withamproclefttype
동일type1
andamprocrighttype
동일Type2
.
an의 필수 의미in_Range
함수는 두 부울 플래그 매개 변수에 따라 다릅니다. 추가하거나 빼야Base
and오프셋
, 그런 다음 비교val
결과는 다음과 같이 :
if!
sub
and!
Less
, returnval
=
(베이스
+
오프셋
)
if!
sub
andLess
, returnval
<=
(Base
+
오프셋
)
ifsub
및!
Less
, returnval
=
(베이스
-
오프셋
)
ifsub
andLess
, returnval
<=
(베이스
-
오프셋
)
그렇게하기 전에 함수는의 부호를 확인해야합니다.오프셋
: 0보다 작은 경우 오류를 올리십시오errcode_invalid_preceding_or_following_size
(22013) 오류 텍스트와 같은“창 함수의 이전 또는 다음 크기에 유효하지 않은”. (비표준 운영자 패밀리는 아마도이 제한을 무시하기로 선택할 수 있지만 SQL 표준에 의해 필요합니다. 이에 대한 의미 론적 필요성이 거의 없기 때문에이 요구 사항은에 위임된다.in_Range
핵심 코드가 무엇을 이해할 필요가 없도록 함수“0보다 작음”특정 데이터 유형을 의미합니다.
추가적인 기대는입니다.in_Range
기능은 실용적이라면 오류를 던지지 않아야합니다Base
+
오프셋
또는Base
-
오프셋
오버플로. 해당 값이 데이터 유형 범위를 벗어난 경우에도 올바른 비교 결과를 결정할 수 있습니다. 데이터 유형에과 같은 개념이 포함 된 경우“Infinity”또는“NAN”in_Range
의 결과는 운영자 제품군의 정상 정렬 순서에 동의합니다.
결과의 결과in_Range
함수는 운영자 제품군이 부과하는 정렬 순서와 일치해야합니다. 고정 된 값이를 감안할 때 정확하게오프셋
및sub
, 다음 :
ifin_Range
withLess
= 일부는 trueval1
andbase
, 모든 것에 대해 사실이어야합니다Val2
<=
val1
같은베이스
.
if27546_27556
withLess
= true는 일부는 거짓입니다val1
및base
, 모든 것에 대해 거짓이어야합니다val2
=
val1
같은Base
.
ifin_Range
withLess
= 일부는 trueval
andBase1
, 모든 것에 대해 사실이어야합니다base2
=
Base1
같은val
.
ifin_Range
withLess
= 일부는 일부는 falseval
andBase1
, 모든 것에 대해 거짓이어야합니다Base2
<=
Base1
같은val
.
거꾸로 된 조건을 가진 유사한 진술은Less
= false.
순서가있는 경우 (type1
) Collatable이므로 적절한 Collation OID가 전달됩니다.in_Range
표준 pg_get_collation () 메커니즘을 사용하여 함수.
in_Range
함수는 널 입력을 처리 할 필요가 없으며 일반적으로 엄격하게 표시됩니다.
EqualImage
선택적으로 Btree 운영자 가족이 제공 할 수 있습니다EqualImage
(“평등은 이미지 평등을 암시합니다”) 지원 기능 번호 4에 등록 된 지원 함수.이 기능을 사용하면 핵심 코드가 BTREE 중복 제거 최적화를 적용하는 것이 안전한시기를 결정할 수 있습니다. 현재,EqualImage
기능은 색인을 구축하거나 재건 할 때만 호출됩니다.
anEqualImage
함수는 서명이 있어야합니다
EqualImage (opcintype
OID
) BOOL을 반환
반환 값은 운영자 클래스 및 Collation에 대한 정적 정보입니다. 반환true
Order
운영자 클래스의 함수는 반품 만 보장됩니다0
(“인수는 동일합니다”) 시점a
andB
인수는 또한 의미 정보의 손실없이 상호 교환 할 수 있습니다. 등록하지 않음EqualImage
기능 또는 반환거짓
이 조건을 보유 할 수 없음을 나타냅니다.
theopcintype
인수는
운영자가 클래스 인덱스 인 데이터 유형의. 이것은 동일한 기본을 재사용 할 수있는 편의입니다pg_type
.OidEqualImage
운영자 클래스에서 기능. 만약에opcintype
는 Collatable Data Type입니다. 적절한 Collation OID가 전달됩니다.EqualImage
표준 사용 함수pg_get_collation ()
메커니즘.
운영자 클래스에 관한 한, 반환true
중복 제거가 안전하다는 것을 나타냅니다 (또는 OID가 전달 된 Collation에 안전합니다EqualImage
함수). 그러나 핵심 코드는 인덱스에 대한 중간 복제 만 안전하다고 간주합니다.Everyindexed 열은 an을 등록하는 연산자 클래스를 사용합니다.EqualImage
함수 및 각 함수는 실제로 반환됩니다true
전화 할 때.
이미지 평등은거의단순한 비트 평등과 동일한 조건. 한 가지 미묘한 차이가 있습니다 : Varlena 데이터 유형을 색인화 할 때, 두 이미지 동등한 기준의 온 디스크 표현은 일관되지 않은로 인해 약간 동일하지 않을 수 있습니다.토스트입력시 압축. 공식적으로 운영자 클래스의 경우EqualImage
함수 반환true
datum_image_eq ()
C 함수는 항상 운영자 클래스와 동의합니다Order
함수 (동일한 Collation OID가 두 사람 모두에게 전달되는 경우EqualImage
및Order
함수).
핵심 코드는 근본적으로를 추론 할 수 없습니다“평등은 이미지 평등을 암시합니다”같은 가족의 다른 운영자 클래스의 세부 사항을 기반으로 다중 데이터 유형 패밀리 내 운영자 클래스 상태. 또한 운영자 가족이 크로스 타입을 등록하는 것은 합리적이지 않습니다.EqualImage
함수와 그렇게하려고 시도하면 오류가 발생합니다. 이건이기 때문입니다.“평등은 이미지 평등을 암시합니다”상태는 운영자 가족 수준에서 다소 정의되는 정렬/평등 의미에 의존하지 않습니다. 일반적으로 특정 데이터 유형이 구현하는 의미는 별도로 고려되어야합니다.
Core에 포함 된 운영자 클래스가 뒤 따르는 컨벤션PostgreSQL배포는 주식을 등록하는 것입니다EqualImage
함수. 대부분의 운영자 클래스 레지스터btequalimage ()
, 이는 중복 제거가 무조건 안전하다는 것을 나타냅니다. 와 같은 협의 가능한 데이터 유형에 대한 운영자 클래스텍스트
레지스터btvarstrequalimage ()
, 이는 중복 제거가 결정 론적 콜라이트로 안전하다는 것을 나타냅니다. 타사 확장에 대한 모범 사례는 제어를 유지하기 위해 자신의 사용자 지정 기능을 등록하는 것입니다.
옵션
선택적으로, B- 토토 운영자 제품군이 제공 할 수 있습니다옵션
(“운영자 클래스 특정 옵션”) 지원 함수 5에 등록 된 지원 함수.
an옵션
지원 함수는 서명이 있어야합니다
옵션 (Rekopts
local_relopts *
) 반환 void
함수가 a에 포인터가 전달됩니다.local_relopts
35388_35538pg_has_opclass_options ()
andpg_get_opclass_options ()
매크로.
현재, B-Tree 운영자 클래스가 없음옵션
지원 기능. B-Tree는 Gist, SP-Gist, Gin 및 Brin과 같은 키를 유연하게 표현할 수 없습니다. 그래서,옵션
현재 B-Tree 인덱스 액세스 방법에 많은 응용 프로그램이 없을 것입니다. 그럼에도 불구하고,이지지 함수는 균일 성을 위해 B- 트리에 추가되었으며, 아마도 B- 트리의 추가 진화 중에postgresql.
이 섹션에서는 고급 사용자에게 사용할 수있는 토토Tree Index 구현 세부 정보를 다룹니다. 보다src/backend/access/nbtree/readme
토토Tree 구현에 대한 훨씬 자세하고 내부 중심의 설명을 위해 소스 분포에서.
PostgreSQLB- 트리 인덱스는 다단계 트리 구조이며, 각 레벨은 이중으로 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다. 다른 모든 페이지는 잎 페이지 또는 내부 페이지입니다. 잎 페이지는 나무의 가장 낮은 수준의 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 잎 페이지에는 테이블 행을 가리키는 튜플이 들어 있습니다. 각 내부 페이지에는 나무의 다음 단계를 가리키는 튜플이 들어 있습니다. 일반적으로 모든 페이지의 99% 이상이 잎 페이지입니다. 내부 페이지와 잎 페이지 모두에 설명 된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 17 : 65.6. 데이터베이스 젠 토토 레이아웃.
기존 잎 페이지가 들어오는 튜플에 맞지 않으면 새로운 잎 페이지가 b- 토토 지수에 추가됩니다. 에이페이지 분할운영은 항목의 일부를 새 페이지로 이동시켜 오버플레이션 페이지에 속한 항목을위한 공간을 만듭니다. 페이지 분할은 또한 새로운 삽입다운 링크부모 페이지의 새 페이지로, 부모가 차례로 분할 될 수 있습니다. 페이지 분할“캐스케이드 위쪽”재귀적인 방식으로. 루트 페이지가 마침내 새 다운 링크에 맞지 않으면 A루트 페이지 분할작동이 이루어집니다. 이것은 원래 루트 페이지보다 한 레벨 인 새 루트 페이지를 만들어 토토 구조에 새로운 레벨을 추가합니다.
B- 트리 인덱스는 MVCC에 따라 동일한 논리 테이블 행의 여러 현존 버전이있을 수 있음을 직접 알지 못합니다. 인덱스에 각 튜플은 자체 색인 항목이 필요한 독립 객체입니다.“버전 이탈”튜플은 때때로 쿼리 대기 시간과 처리량에 부정적인 영향을 줄 수 있습니다. 이것은 일반적으로와 함께 발생합니다.업데이트
-대부분의 개별 업데이트가 적용 할 수없는 Workloadshot최적화.an 동안 하나의 색인으로 덮인 하나의 열만 값을 변경합니다업데이트
항상새로운 인덱스 튜플 세트가 필요합니다 - 하나는각각테이블의 색인. 특히 여기에는 그렇지 않은 색인이 포함되어 있습니다.“논리적으로 수정”by업데이트
. 모든 인덱스에는 테이블의 최신 버전을 가리키는 후속 물리 인덱스 튜플이 필요합니다. 각 지수 내의 각각의 새로운 튜플은 일반적으로 원래와 공존해야합니다“업데이트”짧은 시간 동안 튜플 (일반적으로업데이트
트랜잭션 커밋).
B- 토토 인덱스를 점차적으로 삭제하여 버전 휘젓기 인덱스 튜플을 수행상향식 색인 삭제통과. 각 삭제 패스는 예상되는 것에 대한 반응으로 토토거됩니다“버전 이탈 페이지 분할”. 이것은 논리적으로 수정되지 않은 인덱스에서만 발생합니다업데이트
진술, 특정 페이지에서 쓸모없는 버전의 집중된 구축이 그렇지 않으면 발생합니다. 특정 구현 수준의 휴리스틱은 하나의 쓰레기 인덱스 튜플을 식별하고 삭제하지 못할 수도 있지만 페이지 분할은 일반적으로 피할 수 있습니다 (이 경우 페이지 분할 또는 중복 제거 패스는 잎 페이지에 맞지 않는 새로운 튜플 문제를 해결합니다). 모든 인덱스 스캔이 통과 해야하는 최악의 버전 수 (단일 논리 행의 경우)는 전체 시스템 응답 성 및 처리량에 중요한 기여입니다. 상향식 인덱스 삭제 패스는 의심되는 쓰레기 튜플을 단일 리프 페이지에 기준으로 대상입니다.질적논리적 행 및 버전과 관련된 차이점. 이것은와 대조됩니다.“하향식”Autovacuum Workers가 수행 한 색인 정리.정량적테이블 레벨 임계 값이 초과되었습니다 (참조섹션 24.1.6).
토토Tree 인덱스 내에서 수행되는 모든 삭제 작업이 상향식 삭제 작업이 아닙니다. 인덱스 튜플 삭제의 뚜렷한 범주가 있습니다 :간단한 인덱스 튜플 삭제. 이것은 삭제하기에 안전한 것으로 알려진 인덱스 튜플을 삭제하는 지연된 유지 보수 작업입니다 (품목 식별자가있는 사람LP_DEAD
비트가 이미 설정되었습니다). 상향식 색인 삭제와 마찬가지로, 단순한 인덱스 삭제는 페이지 분할이 분할을 피하는 방법으로 예상되는 시점에서 발생합니다.
단순한 삭제는 최근 인덱스 스캔이 설정 될 때만 발생할 수 있다는 점에서 기회 주의적입니다.LP_DEAD
전달중인 영향을받는 품목의 비트. 앞서서PostgreSQL14, B- 토토 삭제의 유일한 범주는 간단한 삭제였습니다. IT와 상향식 삭제의 주요 차이점은 전자만이 통과 지수 스캔의 활동에 의해 기회 적으로 주도되는 반면, 후자는 특히 버전 휘젓기를 대상으로한다는 것입니다.업데이트
인덱스 된 열을 논리적으로 수정하지 않은 S.
상향식 색인 삭제는 특정 워크로드가있는 특정 인덱스에 대한 대부분의 쓰레기 지수 튜플 정리를 수행합니다. 이것은에서 상당한 버전 휘젓기를받는 B-Tree 지수에서 예상됩니다.업데이트
인덱스가 커버하는 열을 거의 또는 논리적으로 수정하지 않는 경우. 논리 행당 평균 및 최악의 버전 수는 타겟팅 된 증분 결실 패스를 통해 순전히 낮게 유지 될 수 있습니다. 특정 인덱스의 온 디스크 크기는 단일 페이지/블록조차도 절대 증가하지 않을 가능성이 있습니다.Constant버전 이탈에서업데이트
s. 그럼에도 불구하고 철저한“깨끗한 스윕”a진공
운영 (일반적으로 Autovacuum 작업자 프로세스에서 실행) 결국이 필요합니다집단테이블 및 각 인덱스의 정리.
와 달리진공
, 상향식 색인 삭제는 가장 오래된 쓰레기 인덱스 튜플이 얼마나 오래 될 수 있는지에 대한 강력한 보장을 제공하지 않습니다. 인덱스가 유지 될 수 없습니다“플로팅 쓰레기”테이블에서 공유하는 보수적 인 컷오프 포인트와 모든 지수가 총체적으로 사망 한 인덱스 튜플. 이 기본 테이블 수준의 불변량은 테이블을 재활용하기에 안전합니다TIDs. 이것은 독특한 논리적 행이 동일한 테이블을 재사용 할 수있는 방법입니다.TID시간이 지남에 따라 (이것은 평생 동안 같은 두 개의 논리적 행에서는 결코 일어날 수는 없지만진공
사이클).
복제본은 리프 페이지 튜플 (테이블 행을 가리키는 튜플)입니다.all인덱스 된 키 열에는 동일한 인덱스에서 적어도 하나의 다른 리프 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 중복 튜플은 실제로 매우 일반적입니다. B-Tree Indexes는 선택적 기술이 활성화 될 때 중복에 특수한 공간 효율적인 표현을 사용할 수 있습니다.중복 제거.
중복 제거는 중복 튜플 그룹을 정기적으로 병합하여 단일을 형성하여 작동합니다게시 목록각 그룹에 대한 튜플. 열 키 값은이 표현에서 한 번만 나타납니다. 이어서 정렬 된 배열이 뒤 따릅니다.TID테이블의 행을 가리 킵니다. 이는 각 값 (또는 각 열 값의 각 뚜렷한 조합)이 평균적으로 여러 번 나타나는 인덱스의 저장 크기를 크게 줄입니다. 쿼리의 대기 시간을 크게 줄일 수 있습니다. 전체 쿼리 처리량이 크게 증가 할 수 있습니다. 일상적인 지수 진공 청소기의 오버 헤드도 크게 감소 될 수 있습니다.
B- 트리 중복 제거는와 마찬가지로 효과적입니다.“복제”널 값을 포함하는 널 값은 널 값에 따라 서로 같지 않더라도=
B- 토토 연산자 클래스의 구성원. 온 디스크 B- 토토 구조를 이해하는 구현의 어느 부분에 관한 한, NULL은 인덱스 된 값의 도메인의 또 다른 값 일뿐입니다.
중복 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목이 삽입 될 때, 인덱스 튜플 삭제가 새 항목을위한 충분한 공간을 확보 할 수없는 경우에만 (일반적으로 삭제 된 후 건너 뜁니다). 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다. 그것들은 잎 페이지의 원래 논리적 내용의 대안적인 물리적 표현 일뿐입니다. 이 설계는 혼합 읽기 쓰기 워크로드로 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 중복 제거를 통해 최소한의 성능 이점을 볼 수 있습니다. 중복 제거는 기본적으로 활성화됩니다.
색인 생성
및Reindex
게시 목록 튜플을 작성하려면 중복 제거를 적용하지만 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬 된 입력에서 발생하는 중복 일반 튜플의 각 그룹은 게시 목록 튜플로 병합전현재 보류중인 잎 페이지에 추가됩니다. 개별 게시 목록 튜플은 많은 것을 포장합니다TID가능한 한. 잎 페이지는 별도의 중복 제거 패스없이 일반적인 방식으로 작성됩니다. 이 전략은 잘 적합합니다색인 생성
및Reindex
일단 배치 작업이기 때문에
인덱스에 중복 값이 적거나 없어 중복 제거로부터 혜택을받지 못하는 쓰기중인 워크로드는 소규모 고정 성능 페널티가 발생합니다 (중복 제거가 명시 적으로 비활성화되지 않는 한). 그만큼retmuplice_items
스토리지 매개 변수를 사용하여 개별 색인 내에서 중복 제거를 비활성화 할 수 있습니다. 읽기 전용 워크로드에 대한 성능 페널티는 결코 없습니다. 게시 목록 튜플을 읽는 것이 표준 튜플 표현을 읽는 것만 큼 효율적이기 때문입니다. 중복 제거는 일반적으로 도움이되지 않습니다.
때때로 고유 한 인덱스 (고유 한 제약 조건)가 중복 제거를 사용할 수 있습니다. 이를 통해 잎 페이지가 일시적으로“흡수”여분의 버전 휘선 복제. 고유 인덱스의 중복 제거는 상향식 색인 삭제를 보강합니다. 특히 장기 실행 트랜잭션이 쓰레기 수집을 차단하는 스냅 샷을 보유하는 경우. 목표는 상향식 색인 삭제 전략이 다시 효과적이되기위한 시간을 구매하는 것입니다. 단일 장기 거래가 자연스럽게 사라질 때까지 페이지 지연이 나올 수 있습니다. 이전 삭제 패스가 실패한 곳에서 상향식 삭제 패스가 성공할 수 있습니다.
특수 휴리스틱이 적용되어 고유 한 지수의 중복 제거 패스가 이루어져야하는지 여부를 결정합니다. 그것은 종종 잎 페이지를 분할하는 것으로 바로 건너 뛸 수 있으며, 도움이되지 않는 중복 제거 패스에서주기 낭비로 인한 성능 페널티를 피할 수 있습니다. 중복 제거의 오버 헤드에 대해 걱정하는 경우 설정을 고려하십시오retmuplice_items = off
선택적으로. 고유 인덱스로 중복 제거를 가능하게하는 것은 단점이 거의 없습니다.
구현 수준 제한으로 인해 모든 경우에 중복 제거를 사용할 수 없습니다. 중복 제거 안전은 결정됩니다.색인 생성
또는Reindex
가 실행됩니다.
중복 제거는 안전하지 않은 것으로 간주되며 동등한 기준 사이의 의미 적으로 유의미한 차이와 관련된 다음 경우에는 사용할 수 없습니다.
텍스트
, Varchar
및char
a이면 중복 제거를 사용할 수 없습니다.nondeterministicCollation이 사용됩니다. 사례 및 악센트 차이는 동일한 기준 사이에서 보존되어야합니다.
숫자
중복 제거를 사용할 수 없습니다. 숫자 디스플레이 스케일은 동일한 기준 사이에 보존되어야합니다.
JSONB
이후 중복 제거를 사용할 수 없습니다JSONB
B- 토토 운영자 클래스 사용숫자
내부적.
float4
andfloat8
중복 제거를 사용할 수 없습니다. 이러한 유형은에 대한 뚜렷한 표현을 가지고 있습니다.-0
및0
51720_51799
향후 버전에서 해제 될 수있는 구현 수준 제한이 하나 더 있습니다.PostgreSQL:
컨테이너 유형 (예 : 복합 유형, 배열 또는 범위 유형)은 중복 제거를 사용할 수 없습니다.
사용 된 운영자 클래스 또는 Collation에 관계없이 적용되는 추가 구현 수준 제한이 하나 있습니다.
포함
인덱스는 중복 제거를 사용할 수 없습니다.
문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면