이 섹션에서는 고급 사용자에게 사용할 수있는 B-Tree Index 구현 세부 정보를 다룹니다. 보다src/backend/access/nbtree/readme
B-Tree 구현에 대한 훨씬 더 자세하고 내부 중심의 설명에 대한 소스 분포에서.
postgresqlB- 트리 인덱스는 다단계 트리 구조이며, 여기서 트리의 각 레벨은 이중으로 연결된 페이지 목록으로 사용할 수 있습니다. 단일 메타지는 인덱스의 첫 번째 세그먼트 파일 시작시 고정 위치에 저장됩니다. 다른 모든 페이지는 잎 페이지 또는 내부 페이지입니다. 잎 페이지는 나무의 가장 낮은 수준의 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 잎 페이지에는 테이블 행을 가리키는 튜플이 들어 있습니다. 각 내부 페이지에는 나무의 다음 단계를 가리키는 튜플이 들어 있습니다. 일반적으로 모든 페이지의 99% 이상이 잎 페이지입니다. 내부 페이지와 잎 페이지 모두에 설명 된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 16 : 73.6. 데이터베이스 스포츠 토토 결과 레이아웃.
기존 잎 페이지가 들어오는 튜플에 맞지 않으면 새로운 잎 페이지가 B-Tree 지수에 추가됩니다. 에이페이지 분할운영은 항목의 일부를 새 페이지로 이동시켜 오버플리어 페이지에 속한 항목을위한 공간을 만듭니다. 페이지 분할은 또한 새로운 삽입다운 링크부모 페이지의 새 페이지로, 부모가 차례로 분할 될 수 있습니다. 페이지 분할“Cascade Upward”재귀적인 방식으로. 루트 페이지가 마침내 새 다운 링크에 맞지 않으면 A루트 페이지 분할작동이 이루어집니다. 이것은 원래 루트 페이지보다 한 레벨 인 새 루트 페이지를 만들어 트리 구조에 새로운 레벨을 추가합니다.
B- 트리 범퍼카 토토는 MVCC에 따라 동일한 논리 테이블 행의 여러 현존 버전이있을 수 있음을 직접 알지 못합니다. 범퍼카 토토에 각 튜플은 자체 색인 항목이 필요한 독립 객체입니다.“버전 이탈”튜플은 때때로 쿼리 대기 시간과 처리량에 부정적인 영향을 줄 수 있습니다. 이것은 일반적으로와 함께 발생합니다.업데이트
-대부분의 개별 업데이트가 적용 할 수없는 일장 작업량hot최적화.an 동안 하나의 범퍼카 토토로 덮인 한 열의 값 만 변경업데이트
항상새로운 범퍼카 토토 튜플 세트가 필요합니다 - 하나는각각테이블의 색인. 특히 여기에는 그렇지 않은 색인이 포함되어 있습니다.“논리적으로 수정”by업데이트
. 모든 인덱스에는 테이블의 최신 버전을 가리키는 후속 물리 인덱스 튜플이 필요합니다. 각 지수 내의 각각의 새로운 튜플은 일반적으로 원래와 공존해야합니다“업데이트”짧은 시간 동안 튜플 (일반적으로업데이트
트랜잭션 저작).
B- 트리 범퍼카 토토를 점차적으로 삭제하여 버전 휘트 범퍼카 토토 튜플을 수행상향식 색인 삭제통과. 각 삭제 패스는 예상되는 것에 대한 반응으로 트리거됩니다“버전 이탈 페이지 분할”. 이것은 논리적으로 수정되지 않은 인덱스에서만 발생합니다업데이트
진술, 특정 페이지에서 쓸모없는 버전의 집중된 구축이 그렇지 않으면 발생합니다. 특정 구현 수준의 휴리스틱은 하나의 쓰레기 인덱스 튜플을 식별하고 삭제하지 못할 수도 있지만 페이지 분할은 일반적으로 피할 수 있습니다 (이 경우 페이지 분할 또는 중복 제거 패스는 잎 페이지에 맞지 않는 새로운 튜플 문제를 해결합니다). 모든 인덱스 스캔이 통과 해야하는 최악의 버전 수 (단일 논리 행의 경우)는 전체 시스템 응답 성 및 처리량에 중요한 기여입니다. 상향식 인덱스 삭제 패스는 의심되는 쓰레기 튜플을 단일 리프 페이지에 기준으로 대상입니다.질적논리적 행 및 버전과 관련된 차이점. 이것은와 대조됩니다.“하향식”Autovacuum Workers가 수행 한 색인 정리.정량적테이블 레벨 임계 값이 초과되었습니다 (참조섹션 25.1.6).
B-Tree 지수 내에서 수행되는 모든 삭제 작업이 상향식 삭제 작업이 아닙니다. 범퍼카 토토 튜플 삭제의 뚜렷한 범주가 있습니다 :간단한 범퍼카 토토 튜플 삭제. 이것은 삭제하기에 안전한 것으로 알려진 범퍼카 토토 튜플을 삭제하는 지연된 유지 보수 작업입니다 (품목 식별자가있는 사람LP_DEAD
비트가 이미 설정되었습니다). 상향식 색인 삭제와 마찬가지로, 단순한 인덱스 삭제는 페이지 분할이 분할을 피하는 방법으로 예상되는 시점에서 발생합니다.
간단한 삭제는 최근 범퍼카 토토 스캔을 설정할 때만 일어날 수 있다는 점에서 기회 주의적입니다.LP_DEAD
전달중인 영향을받는 품목의 비트. 앞서서PostgreSQL14, B- 트리 삭제의 유일한 범주는 간단한 삭제였습니다. IT와 상향식 삭제의 주요 차이점은 전자만이 통과 지수 스캔의 활동에 의해 기회 적으로 주도되는 반면, 후자는 특히 버전 휘젓기를 대상으로한다는 것입니다.업데이트
인덱스 된 열을 논리적으로 수정하지 않은 s.
상향식 색인 삭제는 특정 워크로드가있는 특정 인덱스에 대한 대부분의 쓰레기 지수 튜플 정리를 수행합니다. 이것은에서 상당한 버전 휘젓기를받는 B-Tree 지수에서 예상됩니다.업데이트
인덱스가 커버하는 열을 거의 또는 논리적으로 수정하지 않는 경우. 논리 행당 평균 및 최악의 버전 수는 타겟팅 된 증분 결실 패스를 통해 순전히 낮게 유지 될 수 있습니다. 특정 인덱스의 온 디스크 크기는 단일 페이지/블록조차도 절대 증가하지 않을 가능성이 있습니다.Constant버전 이탈에서업데이트
s. 그럼에도 불구하고 철저한“클린 스윕”a진공
운영 (일반적으로 Autovacuum Worker 프로세스에서 실행) 결국이 필요합니다집단테이블 및 각 범퍼카 토토의 정리.
와 달리진공
, 상향식 범퍼카 토토 삭제는 가장 오래된 쓰레기 지수 튜플의 나이에 대한 강력한 보장을 제공하지 않습니다. 범퍼카 토토가 유지 될 수 없습니다“플로팅 쓰레기”테이블과 모든 인덱스가 공유 한 보수적 인 컷오프 지점 이전에 죽은 인덱스 튜플. 이 기본 테이블 수준의 불변량은 테이블을 재활용하기에 안전합니다tids. 이것은 독특한 논리적 행이 동일한 테이블을 재사용 할 수있는 방법입니다.TID시간이 지남에 따라 (이것은 평생 동안 같은 두 개의 논리적 행에서는 결코 일어날 수 없지만진공
사이클).
중복은 잎 페이지 튜플 (테이블 행을 가리키는 튜플)입니다.all색인화 된 키 열에는 동일한 범퍼카 토토의 하나 이상의 다른 리프 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 중복 튜플은 실제로 매우 일반적입니다. B-Tree Indexes는 선택적 기술이 활성화 될 때 중복에 특수한 공간 효율적인 표현을 사용할 수 있습니다.중복 제거.
중복 제거는 중복 튜플 그룹을 정기적으로 병합하여 단일을 형성하여 작동합니다게시 목록각 그룹의 튜플. 열 키 값은이 표현에서 한 번만 나타납니다. 이어서 정렬 된 배열이 뒤 따릅니다.TID테이블의 행을 가리 킵니다. 이는 각 값 (또는 각 열 값의 각 뚜렷한 조합)이 평균적으로 여러 번 나타나는 인덱스의 저장 크기를 크게 줄입니다. 쿼리의 대기 시간을 크게 줄일 수 있습니다. 전체 쿼리 처리량이 크게 증가 할 수 있습니다. 일상적인 지수 진공 청소기의 오버 헤드도 크게 감소 될 수 있습니다.
B- 트리 중복 제거는와 마찬가지로 효과적입니다.“복제”널 값을 포함하는 널 값은 널 값에 따라 서로 같지 않더라도=
모든 B- 트리 연산자 클래스의 구성원. 온 디스크 B- 트리 구조를 이해하는 구현의 어느 부분에 관한 한, NULL은 범퍼카 토토 값의 도메인의 또 다른 값 일뿐입니다.
중복 제거 프로세스는 기존 리프 페이지에 맞을 수없는 새 항목이 삽입 될 때, 인덱스 튜플 삭제가 새 항목에 대한 충분한 공간을 확보 할 수없는 경우에만 게으르게 발생합니다 (일반적으로 삭제가 간단히 고려되고 건너 뜁니다). 진 게시 목록 튜플과 달리, b- 트리 게시 목록 튜플은 새로운 복제본을 삽입 할 때마다 확장 할 필요가 없습니다. 그것들은 잎 페이지의 원래 논리적 내용의 대안적인 물리적 표현 일뿐입니다. 이 설계는 혼합 읽기 쓰기 워크로드로 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 중복 제거를 통해 최소한의 성능 이점을 볼 수 있습니다. 중복 제거는 기본적으로 활성화됩니다.
색인 생성
andReindex
게시 목록 튜플을 작성하려면 중복 제거를 적용하지만 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬 된 입력에서 발생하는 중복 일반 튜플의 각 그룹은 게시 목록 튜플로 병합전현재 보류중인 잎 페이지에 추가됩니다. 개별 게시 목록 튜플은 많은 것을 포장합니다TID가능한 한. 잎 페이지는 별도의 중복 제거 패스없이 일반적인 방식으로 작성됩니다. 이 전략은 잘 적합합니다색인 생성
andReindex
일회성 배치 작업이기 때문에
인덱스에 중복 값이 적거나 없어 중복 제거로부터 혜택을받지 못하는 쓰기중인 워크로드는 소규모 고정 성능 페널티가 발생합니다 (중복 제거가 명시 적으로 비활성화되지 않는 한). 그만큼retmuplication_items
스토리지 매개 변수를 사용하여 개별 색인 내에서 중복 제거를 비활성화 할 수 있습니다. 읽기 전용 워크로드에 대한 성능 페널티는 결코 없습니다. 게시 목록 튜플을 읽는 것이 표준 튜플 표현을 읽는 것만 큼 효율적이기 때문입니다. 중복 제거는 일반적으로 도움이되지 않습니다.
때때로 고유 한 인덱스 (고유 한 제약 조건)가 중복 제거를 사용할 수 있습니다. 이를 통해 잎 페이지가 일시적으로“흡수”여분의 버전 휘선이 중복됩니다. 고유 인덱스의 중복 제거는 상향식 색인 삭제를 보강합니다. 특히 장기 실행 트랜잭션이 쓰레기 수집을 차단하는 스냅 샷을 보유하는 경우. 목표는 상향식 색인 삭제 전략이 다시 효과적이되기위한 시간을 구매하는 것입니다. 단일 장기 거래가 자연스럽게 사라질 때까지 페이지 지연이 나올 수 있습니다. 이전 삭제 패스가 실패한 곳에서 상향식 삭제 패스가 성공할 수 있습니다.
특수 휴리스틱이 적용되어 고유 한 지수의 중복 제거 패스가 이루어져야하는지 여부를 결정합니다. 그것은 종종 잎 페이지를 분할하는 것으로 바로 건너 뛸 수 있으며, 도움이되지 않는 중복 제거 패스에서주기 낭비로 인한 성능 페널티를 피할 수 있습니다. 중복 제거의 오버 헤드에 대해 걱정하는 경우 설정을 고려하십시오retmuplice_items = off
선택적으로. 고유 인덱스로 중복 제거를 가능하게하는 것은 단점이 거의 없습니다.
구현 수준 제한으로 인해 모든 경우에 중복 제거를 사용할 수 없습니다. 중복 제거 안전은 결정됩니다.색인 생성
또는Reindex
가 실행됩니다.
중복 제거는 안전하지 않은 것으로 간주되며 동등한 기준 사이의 의미 적으로 유의 한 차이와 관련된 다음 경우에는 사용할 수 없습니다 :
텍스트
, Varchar
및char
a이면 중복 제거를 사용할 수 없습니다.비 결정적Collation이 사용됩니다. 사례 및 악센트 차이는 동일한 기준 사이에서 보존되어야합니다.
숫자
중복 제거를 사용할 수 없습니다. 숫자 디스플레이 스케일은 동일한 기준 사이에 보존되어야합니다.
JSONB
이후 중복 제거를 사용할 수 없습니다JSONB
B- 트리 운영자 클래스 사용숫자
내부적.
float4
andfloat8
중복 제거를 사용할 수 없습니다. 이러한 유형은에 대한 뚜렷한 표현을 가지고 있습니다.-0
and0
22251_22330
향후 버전에서 해제 될 수있는 구현 수준 제한이 하나 더 있습니다PostgreSQL:
컨테이너 유형 (예 : 복합 유형, 배열 또는 범위 유형)은 중복 제거를 사용할 수 없습니다.
사용 된 운영자 클래스 또는 Collation에 관계없이 적용되는 구현 수준 제한이 하나 더 있습니다.
포함
인덱스는 중복 제거를 사용할 수 없습니다.
문서에 올바른 것이없는 것이 있으면 일치하지 않습니다. 특정 기능에 대한 귀하의 경험 또는 추가 설명이 필요합니다. 사용이 양식문서 문제를보고하려면