64.4. 구현

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

64.4.1. B- 트리 구조

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

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

64.4.2. 상향식 색인 삭제

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

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

note

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

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

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

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

64.4.3. 중복 제거

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

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

note

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

중복 제거 프로세스는 기존 잎 페이지에 맞을 수없는 새 항목이 삽입 될 때 게으르게 발생하지만 인덱스 튜플 삭제가 새 항목을위한 충분한 공간을 확보 할 수없는 경우에만 (일반적으로 삭제가 간단히 고려되고 건너 뜁니다). 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다.

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

15114_15322retmuplice_items스토리지 매개 변수를 사용하여 개별 색인 내에서 중복 제거를 비활성화 할 수 있습니다. 읽기 전용 워크로드에 대한 성능 페널티는 결코 없습니다. 게시 목록 튜플을 읽는 것이 표준 튜플 표현을 읽는 것만 큼 효율적이기 때문입니다.

때때로 고유 한 인덱스 (고유 한 제약 조건)가 중복 제거를 사용할 수 있습니다. 이를 통해 잎 페이지가 일시적으로흡수여분의 버전이 중복됩니다. 고유 인덱스의 중복 제거는 상향식 색인 삭제를 보강합니다. 특히 장기 실행 트랜잭션이 쓰레기 수집을 차단하는 스냅 샷을 보유하는 경우.

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

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

중복 제거는 안전하지 않은 것으로 간주되며 동등한 기준 사이의 의미 적으로 유의 한 차이를 포함하는 다음 경우에 사용할 수 없음에 유의하십시오.

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

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

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

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

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

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

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

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

정정 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다.이 양식문서 문제를보고하려면