이 문서는 지원되지 않는 버전의 PostgreSQL을위한 것입니다.
당신은에 대해 같은 페이지를 보려고 할 수 있습니다PostgreSQL : 문서 : 17 : 64.1. 토토 토토 색인버전 또는 위에 나열된 다른 지원 버전 중 하나입니다.

65.1. B- 범퍼카 토토 색인#

65.1.1. 소개#

PostgreSQL표준 구현 포함btree(다중 웨이 균형 범퍼카 토토) 인덱스 데이터 구조. 잘 정의 된 선형 순서로 정렬 할 수있는 모든 데이터 유형은 BTREE 인덱스에 의해 인덱싱 될 수 있습니다.

각 btree 운영자 클래스는 데이터 유형에 정렬 순서를 부과하기 때문에 Btree 운영자 클래스 (또는 실제로 운영자 패밀리)는PostgreSQL의 정렬 의미에 대한 일반적인 표현 및 이해. 따라서 BTREE 지수를 지원하기 위해 필요한 것 이상의 기능과 BTREE와는 상당히 먼 시스템의 일부 기능을 얻었습니다.am그것들을 사용하십시오.

65.1.2. B- 범퍼카 토토 운영자 클래스의 행동#

표 36.3, Btree 연산자 클래스는 5 개의 비교 연산자를 제공해야합니다.<, <=, =, > =and. 하나는 그것을 기대할 수 있습니다<또한 운영자 클래스의 일부가되어야하지만 A를 사용하는 것이 거의 유용하지 않기 때문에 그렇지 않습니다.<인덱스 검색의 위치 조항. (어떤 목적으로, 플래너는 취급<btree 연산자 클래스와 관련된; 그러나 그것은를 통해 그 운영자를 발견합니다.=운영자의 부정 자 링크가 아니라pg_amop.)

몇 가지 데이터 유형이 거의 동일한 정렬 시맨틱을 공유하면 운영자 클래스를 운영자 제품군으로 그룹화 할 수 있습니다. 플래너가 교차 유형 비교에 대한 공제를 할 수 있기 때문에 그렇게하는 것은 유리합니다.느슨한가족. 전체 교차 유형 운영자 세트가 가족에 포함될 것을 권장합니다. 따라서 플래너가 전환으로부터 추론하는 비교 조건을 나타낼 수 있도록하는 것이 좋습니다..

Btree 운영자 가족이 만족해야한다는 몇 가지 기본 가정이 있습니다.

  • an=운영자는 동등한 관계 여야합니다. 즉, 모든 널이 아닌 값에 대해A, B, C데이터 유형의 :

    • A = Atrue (반사 법)

    • ifA = B,B = A (대칭 법)

    • ifA = BandB = C,A = C (전이법)

  • A <운영자는 강력한 순서 관계 여야합니다. 즉, 모든 널이 아닌 값에 대해A, B, C:

    • A < A거짓 (입니다.Irreflexive Law)

    • ifA < BandB < C,A < C (전이법)

  • 또한, 순서는 총입니다. 즉, 모든 널이 아닌 값에 대해A, B:

    • 정확히 하나의A < B, A = BB < Atrue (Trichotomy Law)

    (Trichotomy 법은 비교 지원 기능의 정의를 정당화합니다.)

다른 세 연산자는의 관점에서 정의됩니다.=and<명백한 방식으로 그들과 일관되게 행동해야합니다.

여러 데이터 유형을 지원하는 운영자 패밀리의 경우 위의 법률은 언제 보유해야합니다A, B, C가족의 모든 데이터 유형에서 가져옵니다. 교차 유형 상황에서 2 ~ 3 개의 다른 연산자의 행동이 일관성이 있다는 진술을 나타내는 전이 법률은 가장 까다로워집니다.float8and숫자동일한 운영자 제품군으로, 적어도 현재의 의미론이 아닙니다숫자값은로 변환됩니다.float8A와 비교하려면float8. 제한된 정확도 때문에float8, 이것은 별개의 것이 있음을 의미합니다숫자동일한 것과 동일하게 비교할 값float8값, 따라서 전이법은 실패 할 것입니다.

다중 데이터 유형 패밀리에 대한 또 다른 요구 사항은 운영자 제품군에 포함 된 데이터 유형 사이에 정의 된 암시 적 또는 이진적 계산 캐스트가 관련 정렬 순서를 변경해서는 안된다는 것입니다..

BTREE 지수가 단일 데이터 유형 내에서 이러한 법률을 요구하는 이유는 상당히 명확해야합니다. 또한 다른 데이터 유형의 비교 키를 사용한 인덱스 검색은 두 가지 데이터 유형에서 SANELY를 작동시키기 위해 비교해야합니다.

65.1.3. B- 트리 지원 기능#

표 36.9, Btree는 필요한 하나와 5 개의 선택적 지원 기능을 정의합니다. 6 가지 사용자 정의 방법은 다음과 같습니다.

Order

Btree 운영자 제품군이 비교 연산자에게 제공하는 데이터 유형의 각 조합에 대해, 등록 된 비교 지원 기능을 제공해야합니다PG_AMPROC지원 기능 번호 1 및amproclefttype/amprocrighttype비교를 위해 왼쪽 및 오른쪽 데이터 유형과 동일합니다 (즉, 일치하는 연산자가 in에 등록되는 동일한 데이터 유형pg_amop). 비교 함수는 두 개의 null 값을 취해야합니다AandB그리고 반환 anint32그 값< 0, 0또는 0언제A < B, A = B또는A B각각. 널 결과는 허용되지 않습니다. 데이터 유형의 모든 값은 비교할 수 있어야합니다.src/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 (valtype1,Basetype1,오프셋type2,subbool,Lessbool)

valandBase동일한 유형이어야합니다.이 유형은 운영자 제품군이 지원하는 유형 중 하나입니다 (즉, 주문을 제공하는 유형). 하지만,오프셋다른 유형 일 수 있으며, 그렇지 않으면 가족이 지원하지 않을 수 있습니다. 예를 들어 내장time_ops가족 제공in_Range오프셋OF TYPE간격. 가족이 제공 할 수 있습니다in_Range지원되는 유형 및 하나 이상의 기능오프셋유형. 각in_Range함수를 입력해야합니다PG_AMPROCwithamproclefttype동일type1andamprocrighttype동일Type2.

an의 필수 의미in_Range함수는 두 부울 플래그 매개 변수에 따라 다릅니다. 추가하거나 빼야Baseand오프셋, 그런 다음 비교val다음과 같이 결과에 :

  • if!suband!Less, returnval > = (Base + 오프셋)

  • if!subandLess, returnval <= (Base + 오프셋)

  • ifsuband!Less, returnval > = (Base - 오프셋)

  • ifsubandLess, returnval <= (Base - 오프셋)

그렇게하기 전에 함수는의 부호를 확인해야합니다.오프셋: 0보다 작은 경우 오류를 올리십시오errcode_invalid_preceding_or_following_size(22013) 오류 텍스트와 같은창 함수의 이전 또는 다음 크기 전 또는 다음 크기. (비표준 운영자 패밀리는 아마도이 제한을 무시하기로 선택할 수 있지만 SQL 표준에 의해 필요합니다. 이에 대한 의미 론적 필요성이 거의 없기 때문에이 요구 사항은에 위임된다.in_Range핵심 코드가 무엇을 이해할 필요가 없도록 함수0보다 작음특정 데이터 유형을 의미합니다.

추가적인 기대는입니다.in_Range함수는 실용적이라면 오류를 던지지 않아야합니다.Base + 오프셋또는Base - 오프셋오버플로. 해당 값이 데이터 유형 범위를 벗어난 경우에도 올바른 비교 결과를 결정할 수 있습니다.Infinity또는NANin_Range의 결과는 운영자 제품군의 정상 정렬 순서에 동의합니다.

결과의 결과in_Range함수는 운영자 제품군이 부과하는 정렬 순서와 일치해야합니다. 고정 된 값이를 감안할 때 정확하게오프셋andsub, 다음 :

  • ifin_RangewithLess= 일부는 참입니다val1andBase, 모든 것에 대해 사실이어야합니다Val2 <= val1같은Base.

  • ifin_RangewithLess= 일부는 일부는 falseval1andBase, 모든 것에 대해 거짓이어야합니다Val2 > = val1같은Base.

  • ifin_RangewithLess= 일부는 참입니다valandBase1, 모든 것에 대해 사실이어야합니다Base2 > = Base1같은val.

  • ifin_RangewithLess= 일부는 일부는 falsevalandBase1, 모든 것에 대해 거짓이어야합니다Base2 <= Base1같은val.

반전 된 조건을 가진 유사한 진술은Less= false.

순서가있는 경우 (type1) Collatable이므로 적절한 Collation OID가 전달됩니다.in_Range표준 PG_GET_COLLATION () 메커니즘을 사용하여 함수.

in_Range함수는 널 입력을 처리 할 필요가 없으며 일반적으로 엄격하게 표시됩니다.

EqualImage

선택적으로 Btree 운영자 가족이 제공 할 수 있습니다EqualImage (평등은 이미지 평등을 암시합니다) 지원 함수 번호 4에 등록 된 지원 함수. 현재,EqualImage기능은 범퍼카 토토을 구축하거나 재건 할 때만 호출됩니다.

anEqualImage함수는 서명이 있어야합니다

EqualImage (opcintype OID) BOOL을 반환

반환 값은 운영자 클래스 및 Collation에 대한 정적 정보입니다. 반환trueOrder운영자 클래스의 함수는 반품 만 보장됩니다0 (인수는 동일합니다)시AandB인수는 또한 의미 정보의 손실없이 상호 교환 할 수 있습니다. 등록하지 않음EqualImage기능 또는 반환거짓이 조건을 보유 할 수 없음을 나타냅니다.

theopcintype인수는pg_type.Oid운영자가 클래스 인덱스 인 데이터 유형의. 이것은 동일한 기본을 재사용 할 수있는 편의입니다EqualImage운영자 클래스에서 기능. 만약에opcintype는 Collatable Data 유형이며, 적절한 Collation OID가 전달됩니다.EqualImage표준 사용 함수pg_get_collation ()메커니즘.

운영자 클래스에 관한 한, 반환true중복 제거가 안전하다는 것을 나타냅니다 (또는 OID가 전달 된 Collation에 안전합니다EqualImage함수). 그러나 핵심 코드는 인덱스에 대한 중간 복제 만 안전하다고 간주합니다.Everyindexed 컬럼을 등록하는 연산자 클래스를 사용합니다EqualImage함수 및 각 함수는 실제로 반환됩니다true전화시.

이미지 평등은거의간단한 비트 평등과 동일한 조건. 한 가지 미묘한 차이가 있습니다 : Varlena 데이터 유형을 색인화 할 때, 두 이미지 동등한 기준의 온 디스크 표현은 일관되지 않은로 인해 약간 동일하지 않을 수 있습니다.토스트입력시 압축. 공식적으로 운영자 클래스의 경우EqualImage함수 반환truedatum_image_eq ()C 함수는 항상 운영자 클래스와 동의합니다Order함수 (동일한 Collation OID가 두 가지에 전달되는 경우EqualImageandOrder함수).

핵심 코드는 근본적으로를 추론 할 수 없습니다평등은 이미지 평등을 암시합니다같은 가족의 다른 운영자 클래스의 세부 사항을 기반으로 다중 데이터 타입 패밀리 내 운영자 클래스의 상태. 또한 운영자 가족이 크로스 타입을 등록하는 것은 합리적이지 않습니다.EqualImage함수와 그렇게하려고 시도하면 오류가 발생합니다. 이건이기 때문입니다.평등은 이미지 평등을 암시합니다상태는 운영자 가족 수준에서 다소 정의되는 정렬/평등 의미에 의존하지 않습니다. 일반적으로 특정 데이터 유형이 구현하는 의미는 별도로 고려되어야합니다.

컨벤션과 핵심에 포함 된 운영자 클래스가 뒤 따릅니다PostgreSQL배포는 주식을 등록하는 것입니다EqualImage함수. 대부분의 운영자 클래스 레지스터btequalimage (), 이는 중복 제거가 무조건 안전하다는 것을 나타냅니다. 와 같은 협의 가능한 데이터 유형에 대한 운영자 클래스텍스트레지스터btvarstrequalimage (), 이는 중복 제거가 결정 론적 콜라이트로 안전하다는 것을 나타냅니다. 타사 확장에 대한 모범 사례는 제어를 유지하기 위해 자신의 사용자 지정 기능을 등록하는 것입니다.

옵션

선택적으로, B- 범퍼카 토토 운영자 제품군이 제공 할 수 있습니다옵션 (운영자 클래스 특정 옵션) 지원 함수 5에 등록 된 지원 함수.

an옵션지원 함수는 서명이 있어야합니다

옵션 (Rekopts local_relopts *) 반환 void

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

현재 B-Tree 운영자 클래스는가 없습니다.옵션지원 기능. B-Tree는 Gist, SP-Gist, Gin 및 Brin과 같은 키를 유연하게 표현할 수 없습니다.옵션현재 B-Tree 인덱스 액세스 방법에 많은 응용 프로그램이 없을 것입니다. 그럼에도 불구하고,이지지 함수는 균일 성을 위해 B- 트리에 추가되었으며, 아마도 B- 트리의 추가 진화 중에PostgreSQL.

SkipSupport

선택적으로 Btree 운영자 제품군이 a를 제공 할 수 있습니다.Skip Support지원 기능 번호 6에 등록 된 함수. 이것은 스킵 스캔 최적화를 적용 할 때 핵심 코드에서 사용됩니다.src/include/utils/skipsupport.h.

Skip 지원 기능을 제공하지 않는 운영자 클래스는 여전히 Skip Scan을 사용할 수 있습니다. 핵심 코드는 여전히 폴백 전략을 사용할 수 있지만 일부 개별 유형의 경우에는 최적이 될 수 있습니다.

운영자 가족이 크로스 타입을 등록하는 것은 합리적이지 않습니다SkipSupport함수 및 그렇게하려고 시도하면 오류가 발생합니다. 이는 인덱스 튜플에서 복사 된 값을 증가시켜 다음 인덱스 가능한 값을 결정하는 것이 발생하기 때문입니다.건너 뛰기인덱스 열의 OPClass 입력 유형).

65.1.4. 구현#

이 섹션에서는 고급 사용자에게 사용할 수있는 B-Tree Index 구현 세부 정보를 다룹니다. 보다src/backend/access/nbtree/readmeB-Tree 구현에 대한 훨씬 더 자세하고 내부 중심의 설명에 대한 소스 분포에서.

65.1.4.1. B- 범퍼카 토토 구조#

PostgreSQLB- 범퍼카 토토 인덱스는 다단계 범퍼카 토토 구조이며, 각 레벨은 이중으로 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다.PostgreSQL : 문서 : 개발 : 66.6. 데이터베이스 토토 결과 레이아웃.

기존 잎 페이지가 들어오는 튜플에 맞지 않으면 새로운 잎 페이지가 B- 범퍼카 토토 지수에 추가됩니다. 에이페이지 분할운영은 항목의 일부를 새 페이지로 이동시켜 오버플레이션 페이지에있는 항목을위한 공간을 만듭니다. 페이지 분할은 또한 새로운 삽입다운 링크부모 페이지의 새 페이지로, 이로 인해 부모가 차례로 분할 될 수 있습니다. 페이지 분할Cascade Upward재귀적인 방식으로. 루트 페이지가 마침내 새 다운 링크에 맞지 않으면 A루트 페이지 분할작동이 이루어집니다. 이것은 원래 루트 페이지보다 한 레벨 인 새 루트 페이지를 만들어 범퍼카 토토 구조에 새로운 레벨을 추가합니다.

65.1.4.2. 상향식 범퍼카 토토 삭제#

B- 트리 인덱스는 MVCC에 따라 동일한 논리 테이블 행의 여러 현존 버전이있을 수 있음을 직접 알지 못합니다. 인덱스에 각 튜플은 자체 색인 항목이 필요한 독립 객체입니다.버전 이탈튜플은 때때로 쿼리 대기 시간과 처리량에 부정적인 영향을 줄 수 있습니다. 이것은 일반적으로와 함께 발생합니다.업데이트-대부분의 개별 업데이트가 적용 할 수없는 heavy 워크로드hot최적화.an 동안 하나의 인덱스로 덮인 한 열의 값 만 변경업데이트 항상새로운 인덱스 튜플 세트가 필요합니다 - 하나는각각테이블의 범퍼카 토토. 특히 여기에는 그렇지 않은 범퍼카 토토이 포함되어 있습니다.논리적으로 수정by업데이트. 모든 인덱스에는 테이블의 최신 버전을 가리키는 후속 물리 인덱스 튜플이 필요합니다.업데이트짧은 시간 동안 튜플 (일반적으로업데이트트랜잭션 커밋).

B- 범퍼카 토토 인덱스를 점차적으로 삭제하여 버전 휘젓기 튜플을 수행하여상향식 범퍼카 토토 삭제통과. 각 삭제 패스는 예상되는 것에 대한 반응으로 범퍼카 토토거됩니다버전 이탈 페이지 분할. 이것은 논리적으로 수정되지 않은 인덱스에서만 발생합니다업데이트진술, 특정 페이지에서 쓸모없는 버전의 집중된 구축이 그렇지 않으면 발생합니다. 특정 구현 수준의 휴리스틱은 하나의 쓰레기 인덱스 튜플을 식별하고 삭제하지 못할 수도 있지만 페이지 분할은 일반적으로 피할 수 있습니다 (이 경우 페이지 분할 또는 중복 제거 패스는 잎 페이지에 맞지 않는 새로운 튜플 문제를 해결합니다).질적논리적 행 및 버전과 관련된 차이점. 이것은와 대조됩니다.하향식Autovacuum Workers가 수행 한 범퍼카 토토 정리.정량적테이블 레벨 임계 값이 초과되었습니다 (참조섹션 24.1.6).

Note

B-Tree 인덱스 내에서 수행되는 모든 삭제 작업이 상향식 삭제 작업이 아닙니다. 인덱스 튜플 삭제의 뚜렷한 범주가 있습니다 :간단한 인덱스 튜플 삭제. 이것은 삭제하기에 안전한 것으로 알려진 인덱스 튜플을 삭제하는 지연된 유지 보수 작업입니다 (품목 식별자가있는 사람LP_DEAD비트가 이미 설정되어 있습니다). 상향식 범퍼카 토토 삭제와 마찬가지로, 단순한 인덱스 삭제는 페이지 분할이 분할을 피하는 방법으로 예상되는 시점에서 발생합니다.

단순한 삭제는 최근 인덱스 스캔을 설정할 때만 일어날 수 있다는 점에서 기회 주의적입니다.LP_DEAD전달중인 영향을받는 품목의 비트. 앞서서PostgreSQL14, B- 범퍼카 토토 삭제의 유일한 범주는 간단한 삭제였습니다. IT와 상향식 삭제의 주요 차이점은 전자만이 통과 지수 스캔의 활동에 의해 기회 적으로 주도되는 반면, 후자는 특히 버전 휘젓기를 대상으로한다는 것입니다.업데이트인덱스 된 열을 논리적으로 수정하지 않은 s.

상향식 범퍼카 토토 삭제는 특정 워크로드가있는 특정 인덱스에 대한 대부분의 쓰레기 지수 튜플 정리를 수행합니다. 이것은에서 상당한 버전 휘젓기를받는 B-Tree 지수에서 예상됩니다.업데이트인덱스가 덮는 열을 거의 또는 논리적으로 수정하지 않는 경우. 논리 행당 평균 및 최악의 버전 수는 타겟팅 된 증분 결실 패스를 통해 순전히 낮게 유지 될 수 있습니다.Constant버전 휘젓기업데이트s. 그럼에도 불구하고 철저한클린 스윕a진공운영 (일반적으로 Autovacuum 작업자 프로세스에서 실행) 결국이 필요합니다집단테이블 및 각 인덱스의 정리.

와 달리진공, 상향식 범퍼카 토토 삭제는 가장 오래된 쓰레기 지수 튜플이 얼마나 오래 될 수 있는지에 대한 강력한 보장을 제공하지 않습니다. 인덱스가 유지 될 수 없습니다플로팅 쓰레기테이블과 모든 인덱스가 공유 한 보수적 인 컷오프 지점 이전에 죽은 색인 튜플. 이 기본 테이블 수준의 불변량은 테이블을 재활용하기에 안전합니다TIDs. 이것은 독특한 논리적 행이 동일한 테이블을 재사용 할 수있는 방법입니다.TID시간이 지남에 따라 (이것은 평생 동안 같은 두 개의 논리적 행에서는 결코 일어날 수는 없지만진공사이클).

65.1.4.3. 중복 제거#

복제본은 리프 페이지 튜플 (테이블 행을 가리키는 튜플)입니다.all인덱스 된 키 열에는 동일한 인덱스에서 하나 이상의 다른 잎 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 중복 튜플은 실제로 매우 일반적입니다.중복 제거.

중복 제거는 중복 튜플 그룹을 주기적으로 병합하여 단일을 형성하여 작동합니다.게시 목록각 그룹에 대한 튜플. 열 키 값은이 표현에서 한 번만 나타납니다.TID테이블의 행을 가리 킵니다. 이는 각 값 (또는 각 열 값의 각 뚜렷한 조합)이 평균적으로 여러 번 나타나는 인덱스의 저장 크기를 크게 줄입니다.

Note

B- 트리 중복 제거는와 마찬가지로 효과적입니다.복제널 값을 포함하는 널 값은 널 값이 서로 같지 않더라도=B- 범퍼카 토토 연산자 클래스의 구성원. 온 디스크 B- 범퍼카 토토 구조를 이해하는 구현의 어느 부분에 관한 한, NULL은 인덱스 된 값의 도메인의 또 다른 값 일뿐입니다.

중복 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목이 삽입 될 때, 인덱스 튜플 삭제가 새 항목을위한 충분한 공간을 확보 할 수없는 경우에만 게으르게 발생합니다 (일반적으로 삭제가 간단히 고려되고 건너 뜁니다). 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다.

범퍼카 토토 생성andReindex게시 목록 튜플을 작성하려면 중복 제거를 적용하지만 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬 된 입력에서 발생하는 중복 일반 튜플의 각 그룹은 게시 목록 튜플로 병합현재 보류중인 잎 페이지에 추가됩니다. 개별 게시 목록 튜플은 많은 것을 포장합니다TID가능한 한. 잎 페이지는 별도의 중복 제거 패스없이 일반적인 방식으로 작성됩니다.범퍼카 토토 생성andReindex일단 배치 작업이기 때문에

인덱스에 중복 값이 ​​적거나 없어서 중복 제거로부터 혜택을받지 않는 쓰기중인 워크로드는 소규모 고정 성능 페널티가 발생합니다 (중복 제거가 명시 적으로 비활성화되지 않는 한). 그만큼retmuplice_items스토리지 매개 변수를 사용하여 개별 색인 내에서 중복 제거를 비활성화 할 수 있습니다. 읽기 전용 워크로드에 대한 성능 페널티는 결코 없습니다. 게시 목록 튜플을 읽는 것이 표준 튜플 표현을 읽는 것만 큼 효율적이기 때문입니다.

때때로 고유 한 인덱스 (고유 한 제약 조건)가 중복 제거를 사용할 수 있습니다. 이를 통해 잎 페이지가 일시적으로흡수여분의 버전 휘트 복제. 고유 인덱스의 중복 제거는 상향식 범퍼카 토토 삭제를 보강합니다. 특히 장기 실행 트랜잭션이 쓰레기 수집을 차단하는 스냅 샷을 보유하는 경우.

특수 휴리스틱이 적용되어 고유 한 지수의 중복 제거 패스가 이루어져야하는지 여부를 결정합니다. 그것은 종종 잎 페이지를 분할하는 것으로 바로 건너 뛸 수 있으며, 도움이되지 않는 중복 제거 패스에서주기 낭비로 인한 성능 페널티를 피할 수 있습니다.retmuplice_items = off선택적으로. 고유 인덱스로 중복 제거를 가능하게하는 것은 단점이 거의 없습니다.

구현 수준 제한으로 인해 모든 경우에 중복 제거를 사용할 수 없습니다. 중복 제거 안전은 결정됩니다.범퍼카 토토 생성또는Reindex실행 중.

중복 제거는 안전하지 않은 것으로 간주되며 동등한 기준 사이의 의미 적으로 유의 한 차이와 관련된 다음 경우에는 사용할 수 없습니다 :

  • 텍스트, Varcharchara 일 때 중복 제거를 사용할 수 없습니다.비 결정적Collation이 사용됩니다. 사례 및 악센트 차이는 동일한 기준 사이에서 보존되어야합니다.

  • 숫자중복 제거를 사용할 수 없습니다. 숫자 디스플레이 스케일은 동일한 기준 사이에 보존되어야합니다.

  • JSONB이후 중복 제거를 사용할 수 없습니다.JSONBB- 범퍼카 토토 운영자 클래스 사용숫자내부.

  • float4andfloat8​​중복 제거를 사용할 수 없습니다. 이러한 유형은에 대한 뚜렷한 표현을 가지고 있습니다.-0and037267_37344

향후 버전에서 해제 될 수있는 구현 수준 제한이 하나 더 있습니다.PostgreSQL:

  • 컨테이너 유형 (예 : 복합 유형, 배열 또는 범위 유형)은 중복 제거를 사용할 수 없습니다.

사용 된 운영자 클래스 또는 Collation에 관계없이 적용되는 추가 구현 수준 제한이 하나 있습니다.

  • 포함인덱스는 중복 제거를 사용할 수 없습니다.