이 섹션에서는 고급 사용자에게 사용할 수있는 B-Tree Index 구현 세부 정보를 다룹니다. 보다src/backend/access/nbtree/readme
B-Tree 구현에 대한 훨씬 더 자세하고 내부 중심의 설명에 대한 소스 분포에서.
PostgreSQLB- 트리 인덱스는 다단계 트리 구조이며, 여기서 트리의 각 레벨은 이중 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다. 다른 모든 페이지는 잎 페이지 또는 내부 페이지입니다. 잎 페이지는 나무의 가장 낮은 수준의 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 잎 페이지에는 테이블 행을 가리키는 튜플이 들어 있습니다. 각 내부 페이지에는 나무의 다음 단계를 가리키는 튜플이 들어 있습니다. 일반적으로 모든 페이지의 99% 이상이 잎 페이지입니다. 내부 페이지와 잎 페이지 모두에 설명 된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 13 : 69.6. 데이터베이스 윈 토토 레이아웃.
기존 잎 페이지가 들어오는 튜플에 맞을 수없는 경우 새 잎 페이지가 B- 트리 인덱스에 추가됩니다. 에이페이지 분할운영은 항목의 일부를 새 페이지로 이동시켜 오버플리어 페이지에 속한 항목을위한 공간을 만듭니다. 페이지 분할은 또한 새로운 삽입다운 링크부모 페이지의 새 페이지로, 부모가 차례로 분할 될 수 있습니다. 페이지 분할“캐스케이드 위로”재귀적인 방식으로. 루트 페이지가 마침내 새 다운 링크에 맞지 않으면 A루트 페이지 분할작동이 이루어집니다. 이것은 원래 루트 페이지보다 한 레벨 인 새 루트 페이지를 만들어 트리 구조에 새로운 레벨을 추가합니다.
복제는 잎 페이지 튜플 (테이블 행을 가리키는 튜플)입니다.all인덱스 된 키 열에는 동일한 인덱스의 다른 하나 이상의 다른 잎 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 토토 결과 튜플은 실제로 매우 일반적입니다. B-Tree Indexes는 선택적 기술이 활성화 될 때 토토 결과에 특수한 공간 효율적인 표현을 사용할 수 있습니다.토토 결과 제거.
토토 결과 제거는 중복 튜플 그룹을 정기적으로 병합하여 단일을 형성하여 작동합니다게시 목록각 그룹의 튜플. 열 키 값은이 표현에서 한 번만 나타납니다. 이어서 정렬 된 배열이 뒤 따릅니다.TID테이블의 행을 가리 킵니다. 이는 각 값 (또는 각 열 값의 각 뚜렷한 조합)이 평균적으로 여러 번 나타나는 인덱스의 저장 크기를 크게 줄입니다. 쿼리의 대기 시간을 크게 줄일 수 있습니다. 전체 쿼리 처리량이 크게 증가 할 수 있습니다. 일상적인 지수 진공 청소기의 오버 헤드도 크게 감소 될 수 있습니다.
B- 트리 토토 결과 제거는와 마찬가지로 효과적입니다.“복제”널 값을 포함하는 널 값은 널 값이 서로 같지 않더라도=
B- 트리 연산자 클래스의 구성원. 온 디스크 B- 트리 구조를 이해하는 구현의 어느 부분에 관한 한, NULL은 인덱스 된 값의 도메인의 또 다른 값 일뿐입니다.
토토 결과 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목을 삽입 할 때 게으르게 발생합니다. 이것은 잎 페이지 분할을 방지 (또는 적어도 지연)합니다. 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다. 그것들은 잎 페이지의 원래 논리적 내용의 대안적인 물리적 표현 일뿐입니다. 이 설계는 혼합 읽기 쓰기 워크로드로 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 토토 결과 제거를 통해 최소한의 성능 이점을 볼 수 있습니다. 토토 결과 제거는 기본적으로 활성화됩니다.
색인 생성
andReindex
토토 결과 제거를 적용하여 게시 목록 튜플을 작성하십시오. 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬 된 입력에서 발생하는 중복 일반 튜플의 각 그룹은 게시 목록 튜플로 병합전현재 보류중인 잎 페이지에 추가됩니다. 개별 게시 목록 튜플은 많은 것을 포장합니다TID가능한 한. 잎 페이지는 별도의 토토 결과 제거 패스없이 일반적인 방식으로 작성됩니다. 이 전략은 잘 적합합니다색인 생성
andreindex
일단 배치 작업이기 때문에
인덱스에 중복 값이 적거나 없어서 토토 결과 제거로부터 혜택을받지 않는 쓰기중인 워크로드는 소규모 고정 성능 페널티가 발생합니다 (토토 결과 제거가 명시 적으로 비활성화되지 않는 한). 그만큼retmuplice_items
스토리지 매개 변수를 사용하여 개별 색인 내에서 토토 결과 제거를 비활성화 할 수 있습니다. 읽기 전용 워크로드에 대한 성능 페널티는 결코 없습니다. 게시 목록 튜플을 읽는 것이 표준 튜플 표현을 읽는 것만 큼 효율적이기 때문입니다. 토토 결과 제거는 일반적으로 도움이되지 않습니다.
B- 트리 인덱스는 MVCC에 따라 동일한 논리 테이블 행의 여러 현존 버전이있을 수 있음을 직접 알지 못합니다. 인덱스에 각 튜플은 자체 색인 항목이 필요한 독립 객체입니다.“버전 복제”때때로 쿼리 대기 시간 및 처리량에 부정적인 영향을 줄 수 있습니다. 이것은 일반적으로와 함께 발생합니다.업데이트
-대부분의 개별 업데이트가 적용 할 수없는 heavy Workloadshot최적화(종종 하나 이상의 인덱스 열이 수정되어 새로운 인덱스 튜플 버전 세트가 필요하기 때문에 하나의 새로운 튜플각각색인). 사실상, B-Tree 토토 결과 제거는 버전 휘젓기로 인한 인덱스 팽창을 개선합니다. 고유 한 지수의 튜플조차도 반드시물리적버전 휘젓기로 인해 디스크에 저장된 경우 고유합니다. 토토 결과 제거 최적화는 고유 인덱스 내에서 선택적으로 적용됩니다. 버전 복제가있는 것으로 보이는 페이지를 대상으로합니다. 높은 수준의 목표는주는 것입니다진공
a 전에 더 많은 시간“불필요한”버전 휘젓기로 인한 페이지 분할이 일어날 수 있습니다.
특수 휴리스틱이 적용되어 고유 한 인덱스의 토토 결과 제거 패스가 이루어져야하는지 여부를 결정합니다. 그것은 종종 잎 페이지를 분할하는 것으로 바로 건너 뛸 수 있으며, 도움이되지 않는 토토 결과 제거 패스에서주기 낭비로 인한 성능 페널티를 피할 수 있습니다. 중복 제거의 오버 헤드에 대해 걱정하는 경우 설정을 고려하십시오retmuplice_items = off
선택적으로. 고유 인덱스로 토토 결과 제거를 가능하게하는 것은 단점이 거의 없습니다.
구현 수준 제한으로 인해 모든 경우에 토토 결과 제거를 사용할 수 없습니다. 토토 결과 제거 안전은 결정됩니다.색인 생성
또는Reindex
가 실행됩니다.
토토 결과 제거는 안전하지 않은 것으로 간주되며 동등한 데이텀 간의 의미 적으로 유의 한 차이와 관련된 다음 경우에 사용할 수 없음에 유의하십시오.
텍스트
, Varchar
및char
a이면 토토 결과 제거를 사용할 수 없습니다.비 결정적Collation이 사용됩니다. 사례 및 악센트 차이는 동일한 기준 사이에서 보존되어야합니다.
숫자
토토 결과 제거를 사용할 수 없습니다. 숫자 디스플레이 스케일은 동일한 기준 사이에 보존되어야합니다.
JSONB
이후 토토 결과 제거를 사용할 수 없습니다JSONB
B- 트리 운영자 클래스 사용숫자
내부적.
float4
andfloat8
토토 결과 제거를 사용할 수 없습니다. 이러한 유형은에 대한 뚜렷한 표현을 가지고 있습니다.-0
and0
16235_16314
향후 버전에서 해제 될 수있는 구현 수준 제한이 하나 더 있습니다.PostgreSQL:
컨테이너 유형 (예 : 복합 유형, 배열 또는 범위 유형)은 토토 결과 제거를 사용할 수 없습니다.
사용 된 운영자 클래스 또는 Collation에 관계없이 적용되는 추가 구현 수준 제한이 하나 있습니다.
포함
인덱스는 토토 결과 제거를 사용할 수 없습니다.
문서에 올바른 것이 없다면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면