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