63.4. 구현

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

63.4.1. B- 트리 구조

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

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

63.4.2. 토토 결과 제거

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

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

Note

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

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

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

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

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

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

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

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

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

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

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

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

향후 |PostgreSQL:

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

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

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

정정 제출

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