이 섹션에서는 고급 사용자에게 유용할 수 있는 B-트리 색인 구현 세부정보를 다룹니다. 보다src/백엔드/액세스/nbtree/READMEB-Tree 구현에 대한 훨씬 더 자세한 내부 중심 설명을 보려면 소스 배포판을 참조하세요.
포스트그레SQLB-트리 인덱스는 다중 레벨 트리 구조로, 트리의 각 레벨은 이중으로 연결된 페이지 목록으로 사용될 수 있습니다. 단일 메타페이지는 인덱스의 첫 번째 세그먼트 파일 시작 부분에 있는 고정 위치에 저장됩니다. 다른 모든 페이지는 리프 페이지이거나 내부 페이지입니다. 리프 페이지는 트리의 가장 낮은 수준에 있는 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 리프 페이지에는 테이블 행을 가리키는 튜플이 포함되어 있습니다. 각 내부 페이지에는 트리의 다음 수준을 가리키는 튜플이 포함되어 있습니다. 일반적으로 모든 페이지의 99% 이상이 리프 페이지입니다. 내부 페이지와 리프 페이지 모두에 설명된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 15 : 73.6. 데이터베이스 토토 레이아웃.
기존 리프 페이지가 들어오는 튜플에 맞지 않을 때 새로운 리프 페이지가 B-트리 색인에 추가됩니다. 에이페이지 분할작업은 항목의 일부를 새 페이지로 이동하여 원래 오버플로된 페이지에 속했던 항목을 위한 공간을 만듭니다. 페이지 분할에는 새도 삽입해야 합니다.다운링크상위 페이지의 새 페이지로 이동하면 상위 페이지가 차례로 분할될 수 있습니다. 페이지 분할“계단식 위쪽으로”재귀적인 방식으로. 루트 페이지가 마침내 새로운 다운링크에 맞지 않을 때, a루트 페이지 분할작동이 발생합니다. 이렇게 하면 원래 루트 페이지보다 한 수준 높은 새 루트 페이지를 생성하여 트리 구조에 새 수준을 추가합니다.
B-트리 토토 사이트 순위는 MVCC에 동일한 논리 테이블 행의 여러 현존 버전이 있을 수 있다는 사실을 직접 인식하지 못합니다. 토토 사이트 순위에 대한 각 튜플은 자체 토토 사이트 순위 항목이 필요한 독립 객체입니다.“버전 변동”튜플은 때때로 누적되어 쿼리 대기 시간 및 처리량에 부정적인 영향을 미칠 수 있습니다. 이는 일반적으로 다음과 같은 경우에 발생합니다.업데이트-대부분의 개별 업데이트가 적용할 수 없는 과중한 작업 부하핫최적화.중 하나의 색인에 포함된 단 하나의 열 값 변경업데이트 항상새로운 토토 사이트 순위 튜플 세트가 필요합니다 — 하나는각각 모두테이블의 색인입니다. 특히 여기에는 그렇지 않은 토토 사이트 순위가 포함되어 있습니다.“논리적으로 수정됨”by the업데이트. 모든 토토 사이트 순위에는 테이블의 최신 버전을 가리키는 후속 실제 토토 사이트 순위 튜플이 필요합니다. 각 토토 사이트 순위 내의 각각의 새로운 튜플은 일반적으로 원본과 공존해야 합니다.“업데이트됨”짧은 기간 동안 튜플(일반적으로 다음 직후까지업데이트트랜잭션 커밋).
B-트리 인덱스는 다음을 수행하여 버전 변동 인덱스 튜플을 점진적으로 삭제합니다.상향식 색인 삭제통과합니다. 각 삭제 패스는 예상되는 조치에 반응하여 트리거됩니다.“버전 변동 페이지 분할”. 이는 논리적으로 수정되지 않은 토토 사이트 순위에서만 발생합니다.업데이트문, 그렇지 않으면 특정 페이지에 사용되지 않는 버전이 집중적으로 축적되는 경우가 발생합니다. 페이지 분할은 일반적으로 피할 수 있지만, 특정 구현 수준의 휴리스틱이 하나의 가비지 인덱스 튜플도 식별하고 삭제하지 못할 가능성이 있습니다(이 경우 페이지 분할 또는 중복 제거 단계는 들어오는 새 튜플이 리프 페이지에 맞지 않는 문제를 해결합니다). 단일 논리 행에 대해 인덱스 스캔이 통과해야 하는 최악의 버전 수는 전체 시스템 응답성과 처리량에 중요한 영향을 미칩니다. 상향식 인덱스 삭제 단계는 다음을 기반으로 단일 리프 페이지에서 의심되는 가비지 튜플을 대상으로 합니다.정성적논리적 행 및 버전과 관련된 차이점. 이는 다음과 대조됩니다.“하향식”autovacuum 작업자가 수행하는 토토 사이트 순위 정리(확실할 때 트리거됨)정량적테이블 수준 임계값이 초과되었습니다(참조섹션 25.1.6).
B-트리 토토 사이트 순위 내에서 수행되는 모든 삭제 작업이 상향식 삭제 작업은 아닙니다. 토토 사이트 순위 튜플 삭제에는 고유한 범주가 있습니다.간단한 토토 사이트 순위 튜플 삭제. 이는 삭제해도 안전한 것으로 알려진 토토 사이트 순위 튜플(항목 식별자의 튜플)을 삭제하는 지연된 유지 관리 작업입니다.LP_DEAD비트가 이미 설정되어 있습니다). 상향식 인덱스 삭제와 마찬가지로 단순 인덱스 삭제는 분할을 피하기 위한 방법으로 페이지 분할이 예상되는 시점에 발생합니다.
단순 삭제는 최근 색인 스캔이 설정된 경우에만 발생할 수 있다는 점에서 기회주의적입니다.LP_DEAD영향을 받은 항목이 지나가고 있습니다. 앞서서포스트그레SQL14, B-Tree 삭제의 유일한 범주는 단순 삭제였습니다. 상향식 삭제와 주요 차이점은 전자만이 인덱스 스캔을 통과하는 활동에 의해 기회에 따라 구동되는 반면 후자만이 구체적으로 버전 변동을 목표로 한다는 것입니다.업데이트s는 색인화된 열을 논리적으로 수정하지 않습니다.
상향식 인덱스 삭제는 특정 작업 부하가 있는 특정 인덱스에 대한 모든 가비지 인덱스 튜플 정리의 대부분을 수행합니다. 이는 상당한 버전 변동이 발생할 수 있는 모든 B-Tree 인덱스에서 예상되는 현상입니다.업데이트s는 토토 사이트 순위가 포함하는 열을 논리적으로 거의 또는 전혀 수정하지 않습니다. 논리적 행당 평균 및 최악의 경우 버전 수는 대상 증분 삭제 단계를 통해서만 낮게 유지될 수 있습니다. 그럼에도 불구하고 특정 토토 사이트 순위의 디스크 크기는 단일 페이지/블록 하나도 증가하지 않을 가능성이 높습니다.상수버전 변동:업데이트s. 그럼에도 불구하고 철저한“클린 스윕”작성자:진공작업(일반적으로 자동 진공 작업자 프로세스에서 실행)은 결국 다음 작업의 일부로 필요하게 됩니다.집단테이블과 각 토토 사이트 순위 정리.
달리진공, 상향식 토토 사이트 순위 삭제는 가장 오래된 가비지 토토 사이트 순위 튜플이 얼마나 오래되었는지에 대한 강력한 보장을 제공하지 않습니다. 토토 사이트 순위 보유를 허용할 수 없습니다.“떠다니는 쓰레기”테이블과 해당 인덱스 전체가 공유하는 보수적 구분점 이전에 죽은 인덱스 튜플입니다. 이 기본적인 테이블 수준 불변성은 테이블을 안전하게 재활용할 수 있게 해줍니다.TIDs. 이는 서로 다른 논리적 행이 동일한 테이블을 재사용하는 것이 가능한 방법입니다.TID시간이 지남에 따라(수명 기간이 동일한 두 개의 논리적 행에서는 결코 이런 일이 발생하지 않지만진공주기).
중복은 리프 페이지 튜플(테이블 행을 가리키는 튜플)입니다.모두인덱싱된 키 열에는 동일한 토토 사이트 순위에 있는 하나 이상의 다른 리프 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 중복 튜플은 실제로 매우 일반적입니다. B-트리 토토 사이트 순위는 선택적 기술이 활성화된 경우 중복에 대해 특별하고 공간 효율적인 표현을 사용할 수 있습니다.중복제거.
중복 제거는 중복된 튜플 그룹을 주기적으로 병합하여 단일을 형성하는 방식으로 작동합니다.게시 목록각 그룹에 대한 튜플입니다. 열 키 값은 이 표현에서 한 번만 나타납니다. 그 다음에는 정렬된 배열이 옵니다.TID16276_16647
B-Tree 중복 제거는 다음과 같이 효과적입니다.“중복”에 따라 NULL 값이 결코 서로 같지 않더라도 NULL 값을 포함하는=B-Tree 연산자 클래스의 구성원. 온디스크 B-트리 구조를 이해하는 구현 부분에 관한 한 NULL은 토토 사이트 순위 값 도메인의 또 다른 값일 뿐입니다.
중복 제거 프로세스는 기존 리프 페이지에 맞지 않는 새 항목을 삽입할 때 느리게 발생합니다. 단, 색인 튜플 삭제로 새 항목을 위한 충분한 공간을 확보할 수 없는 경우에만 가능합니다(일반적으로 삭제를 잠시 고려한 후 건너뜁니다). GIN 게시 목록 튜플과 달리 B-Tree 게시 목록 튜플은 새 복제본이 삽입될 때마다 확장할 필요가 없습니다. 이는 단지 리프 페이지의 원래 논리적 내용을 대체하는 물리적 표현일 뿐입니다. 이 설계는 혼합된 읽기-쓰기 워크로드에서 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 중복 제거를 사용하면 최소한 중간 정도의 성능 이점을 얻을 수 있습니다. 중복 제거는 기본적으로 활성화되어 있습니다.
색인 생성그리고REINDEX중복 제거를 적용하여 게시 목록 튜플을 생성합니다. 하지만 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬된 입력에서 발견된 중복 일반 튜플의 각 그룹은 게시 목록 튜플로 병합됩니다.이전현재 보류 중인 리프 페이지에 추가 중입니다. 개별 게시 목록 튜플은 여러 개로 구성됩니다.TID가능한 한. 리프 페이지는 별도의 중복 제거 패스 없이 일반적인 방식으로 작성됩니다. 이 전략은 다음에 적합합니다.색인 생성그리고REINDEX일회성 일괄 작업이기 때문입니다.
인덱스에 중복 값이 거의 없거나 전혀 없기 때문에 중복 제거의 이점을 누리지 못하는 쓰기 중심 작업 부하는 중복 제거가 명시적으로 비활성화되지 않는 한 작고 고정된 성능 저하를 초래합니다. 그만큼deduplicate_itemsstorage 매개변수를 사용하여 개별 인덱스 내에서 중복 제거를 비활성화할 수 있습니다. 게시 목록 튜플을 읽는 것은 적어도 표준 튜플 표현을 읽는 것만큼 효율적이므로 읽기 전용 워크로드에서는 성능 저하가 전혀 없습니다. 중복 제거를 비활성화하는 것은 일반적으로 도움이 되지 않습니다.
때때로 고유 인덱스(및 고유 제약 조건)에서 중복 제거를 사용할 수 있습니다. 이를 통해 리프 페이지는 일시적으로 허용됩니다.“흡수”추가 버전 이탈이 중복되었습니다. 고유 인덱스의 중복 제거는 특히 장기 실행 트랜잭션이 가비지 수집을 차단하는 스냅샷을 보유하는 경우 상향식 인덱스 삭제를 증가시킵니다. 목표는 상향식 지수 삭제 전략이 다시 효과적일 때까지 시간을 벌기 위한 것입니다. 단일 장기 실행 트랜잭션이 자연스럽게 사라질 때까지 페이지 분할을 지연하면 이전 삭제 단계가 실패한 경우 상향식 삭제 단계가 성공할 수 있습니다.
고유 인덱스의 중복 제거 패스가 발생해야 하는지 여부를 결정하기 위해 특별한 경험적 방법이 적용됩니다. 종종 리프 페이지 분할로 바로 건너뛰어 도움이 되지 않는 중복 제거 단계의 주기 낭비로 인한 성능 저하를 방지할 수 있습니다. 중복 제거 오버헤드가 우려된다면 설정을 고려하세요.deduplicate_items = 꺼짐선택적으로. 고유 색인에서 중복 제거를 활성화하면 단점이 거의 없습니다.
구현 수준 제한으로 인해 모든 경우에 중복 제거를 사용할 수는 없습니다. 중복 제거 안전성은 다음과 같은 경우에 결정됩니다.색인 생성또는REINDEX실행되었습니다.
중복 제거는 안전하지 않은 것으로 간주되며 동일한 데이터 간에 의미상 중요한 차이가 있는 다음과 같은 경우에는 사용할 수 없습니다.
텍스트, varchar및문자다음의 경우 중복 제거를 사용할 수 없습니다.비결정적콜레이션이 사용됩니다. 대소문자 및 악센트 차이는 동일한 데이텀 간에 유지되어야 합니다.
숫자중복 제거를 사용할 수 없습니다. 숫자 표시 배율은 동일한 데이텀 간에 유지되어야 합니다.
jsonb중복 제거를 사용할 수 없습니다.jsonbB-트리 연산자 클래스 사용숫자내부적으로.
float4그리고float8중복 제거를 사용할 수 없습니다. 이러한 유형에는 다음과 같은 고유한 표현이 있습니다.-0그리고0, 그럼에도 불구하고 동일한 것으로 간주됩니다. 이 차이는 보존되어야 합니다.
향후 버전에서 해제될 수 있는 구현 수준 제한이 하나 더 있습니다.포스트그레SQL:
컨테이너 유형(예: 복합 유형, 배열 또는 범위 유형)은 중복 제거를 사용할 수 없습니다.
사용된 연산자 클래스 또는 데이터 정렬에 관계없이 적용되는 구현 수준 제한이 하나 더 있습니다:
포함색인은 중복 제거를 사용할 수 없습니다.
문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.