64.1. B- 토토 색인#

64.1.1. 소개#

PostgreSQL표준 구현 포함btree(다중 웨이 균형 토토) 인덱스 데이터 구조. 잘 정의 된 선형 순서로 정렬 할 수있는 모든 데이터 유형은 BTREE 인덱스에 의해 인덱싱 될 수 있습니다. 유일한 제한은 인덱스 항목이 페이지의 약 1/3을 초과 할 수 없다는 것입니다 (해당되는 경우 토스트 압축 후).

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

64.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 < ais false (Irreflexive Law)

    • ifa < BandB < C, 그 다음a < C(전이법)

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

    • 정확히 하나의a < B, a = BB < ais true (Trichotomy Law)

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

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

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

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

BTREE 지수가 단일 데이터 유형 내에서 이러한 법률을 요구하는 이유는 상당히 명확해야합니다. 또한 다른 데이터 유형의 비교 키를 사용한 인덱스 검색은 두 가지 데이터 유형에서 SANELY를 작동시키기 위해 비교해야합니다. 가족 내 3 개 이상의 데이터 유형에 대한 확장은 Btree Index 메커니즘 자체에 의해 엄격하게 요구되지 않지만 플래너는 최적화 목적으로 이들을 의존합니다..

64.1.3. B- 트리 지원 기능#

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

Order

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

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

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

  • if!suband!Less, returnval =(베이스 + 오프셋)

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

  • ifsub!Less, returnval =(베이스 - 오프셋)

  • ifsubandLess, returnval <=(베이스 - 오프셋)

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

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

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

  • ifin_RangewithLess= 일부는 trueval1andbase, 모든 것에 대해 사실이어야합니다Val2 <= val1같은베이스.

  • if27546_27556withLess= true는 일부는 거짓입니다val1base, 모든 것에 대해 거짓이어야합니다val2 = val1같은Base.

  • ifin_RangewithLess= 일부는 truevalandBase1, 모든 것에 대해 사실이어야합니다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에 등록 된 지원 함수.이 기능을 사용하면 핵심 코드가 BTREE 중복 제거 최적화를 적용하는 것이 안전한시기를 결정할 수 있습니다. 현재,EqualImage기능은 색인을 구축하거나 재건 할 때만 호출됩니다.

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

EqualImage (opcintype OID) BOOL을 반환

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

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

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

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

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

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

옵션

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

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

옵션 (Rekopts local_relopts *) 반환 void

함수가 a에 포인터가 전달됩니다.local_relopts35388_35538pg_has_opclass_options ()andpg_get_opclass_options ()매크로.

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

64.1.4. 구현#

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

64.1.4.1. B- 토토 구조#

PostgreSQLB- 트리 인덱스는 다단계 트리 구조이며, 각 레벨은 이중으로 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다. 다른 모든 페이지는 잎 페이지 또는 내부 페이지입니다. 잎 페이지는 나무의 가장 낮은 수준의 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 잎 페이지에는 테이블 행을 가리키는 튜플이 들어 있습니다. 각 내부 페이지에는 나무의 다음 단계를 가리키는 튜플이 들어 있습니다. 일반적으로 모든 페이지의 99% 이상이 잎 페이지입니다. 내부 페이지와 잎 페이지 모두에 설명 된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 17 : 65.6. 데이터베이스 젠 토토 레이아웃.

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

64.1.4.2. 상향식 색인 삭제#

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

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

Note

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

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

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

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

64.1.4.3. 중복 제거#

복제본은 리프 페이지 튜플 (테이블 행을 가리키는 튜플)입니다.all인덱스 된 키 열에는 동일한 인덱스에서 적어도 하나의 다른 리프 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 중복 튜플은 실제로 매우 일반적입니다. B-Tree Indexes는 선택적 기술이 활성화 될 때 중복에 특수한 공간 효율적인 표현을 사용할 수 있습니다.중복 제거.

중복 제거는 중복 튜플 그룹을 정기적으로 병합하여 단일을 형성하여 작동합니다게시 목록각 그룹에 대한 튜플. 열 키 값은이 표현에서 한 번만 나타납니다. 이어서 정렬 된 배열이 뒤 따릅니다.TID테이블의 행을 가리 킵니다. 이는 각 값 (또는 각 열 값의 각 뚜렷한 조합)이 평균적으로 여러 번 나타나는 인덱스의 저장 크기를 크게 줄입니다. 쿼리의 대기 시간을 크게 줄일 수 있습니다. 전체 쿼리 처리량이 크게 증가 할 수 있습니다. 일상적인 지수 진공 청소기의 오버 헤드도 크게 감소 될 수 있습니다.

Note

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

중복 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목이 삽입 될 때, 인덱스 튜플 삭제가 새 항목을위한 충분한 공간을 확보 할 수없는 경우에만 (일반적으로 삭제 된 후 건너 뜁니다). 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다. 그것들은 잎 페이지의 원래 논리적 내용의 대안적인 물리적 표현 일뿐입니다. 이 설계는 혼합 읽기 쓰기 워크로드로 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 중복 제거를 통해 최소한의 성능 이점을 볼 수 있습니다. 중복 제거는 기본적으로 활성화됩니다.

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

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

때때로 고유 한 인덱스 (고유 한 제약 조건)가 중복 제거를 사용할 수 있습니다. 이를 통해 잎 페이지가 일시적으로흡수여분의 버전 휘선 복제. 고유 인덱스의 중복 제거는 상향식 색인 삭제를 보강합니다. 특히 장기 실행 트랜잭션이 쓰레기 수집을 차단하는 스냅 샷을 보유하는 경우. 목표는 상향식 색인 삭제 전략이 다시 효과적이되기위한 시간을 구매하는 것입니다. 단일 장기 거래가 자연스럽게 사라질 때까지 페이지 지연이 나올 수 있습니다. 이전 삭제 패스가 실패한 곳에서 상향식 삭제 패스가 성공할 수 있습니다.

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

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

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

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

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

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

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

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

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

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

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

수정 제출

문서에 올바른 것이 없으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면