63.4. 구현

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

63.4.1. B- 트리 구조

postgresqlB- 트리 인덱스는 다단계 트리 구조이며, 여기서 트리의 각 레벨은 이중 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다.섹션 69.6.

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

63.4.2. 토토 결과 제거

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

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

Note

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

토토 결과 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목이 삽입되면 게으름하게 발생합니다. 이것은 잎 페이지 분할을 방지 (또는 적어도 지연)합니다.

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

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

B- 트리 인덱스는 MVCC에 따라 동일한 논리 테이블 행의 여러 현존 버전이있을 수 있음을 직접 알지 못합니다. 인덱스에 각 튜플은 자체 색인 항목이 필요한 독립 객체입니다.버전 복제때때로 쿼리 대기 시간 및 처리량을 축적하고 부정적인 영향을 줄 수 있습니다. 이것은 일반적으로와 함께 발생합니다.업데이트-대부분의 개별 업데이트가 적용 할 수없는 heavy 워크로드hot최적화(종종 하나 이상의 인덱스 된 열이 수정되기 때문에 새로운 인덱스 튜플 버전 세트 - 하나의 새로운 튜플각각색인). 사실상, B-Tree 토토 결과 제거는 버전 휘젓기로 인한 인덱스 팽창을 개선합니다.물리적버전 휘젓기로 인해 디스크에 저장 될 때 고유합니다. 토토 결과 제거 최적화는 고유 인덱스 내에서 선택적으로 적용됩니다.진공an reme 전에 더 많은 시간불필요한버전 휘젓기로 인한 페이지 분할이 발생할 수 있습니다.

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

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

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

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

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

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

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

향후 |postgresql:

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

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

  • 포함인덱스는 토토 결과 제거를 사용할 수 없습니다.

정정 제출

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