63.4. 구현

이 섹션은 고급 사용자에게 유용할 수 있는 B-트리 색인 구현 세부사항을 다룹니다. 참조src/백엔드/액세스/nbtree/READMEB-Tree 구현에 대한 훨씬 더 자세한 내부 중심 설명을 보려면 소스 배포판을 참조하세요.

63.4.1. B-트리 구조

포스트그레SQLB-트리 인덱스는 다중 레벨 트리 구조로, 트리의 각 레벨은 이중으로 연결된 페이지 목록으로 사용될 수 있습니다. 단일 메타페이지는 인덱스의 첫 번째 세그먼트 파일 시작 부분에 있는 고정 위치에 저장됩니다. 다른 모든 페이지는 리프 페이지이거나 내부 페이지입니다. 리프 페이지는 트리의 가장 낮은 수준에 있는 페이지입니다. 다른 모든 레벨은 내부 페이지로 구성됩니다. 각 리프 페이지에는 테이블 행을 가리키는 튜플이 포함되어 있습니다. 각 내부 페이지에는 트리의 다음 수준을 가리키는 튜플이 포함되어 있습니다. 일반적으로 모든 페이지의 99% 이상이 리프 페이지입니다. 내부 페이지와 리프 페이지 모두에 설명된 표준 페이지 형식을 사용합니다.PostgreSQL : 문서 : 13 : 69.6. 데이터베이스 윈 토토 레이아웃.

기존 리프 페이지가 들어오는 튜플에 맞지 않을 때 새로운 리프 페이지가 B-트리 색인에 추가됩니다. 갑페이지 분할작업은 항목의 일부를 새 페이지로 이동하여 원래 오버플로된 페이지에 속했던 항목을 위한 공간을 만듭니다. 페이지 분할에는 새도 삽입해야 합니다.다운링크상위 페이지의 새 페이지로 이동하면 상위 페이지가 차례로 분할될 수 있습니다. 페이지 분할계단식 위쪽으로재귀적인 방식으로. 루트 페이지가 마침내 새로운 다운링크에 맞지 않을 때, a루트 페이지 분할작동이 발생합니다. 이렇게 하면 원래 루트 페이지보다 한 수준 높은 새 루트 페이지를 생성하여 트리 구조에 새 수준을 추가합니다.

63.4.2. 토토 결과 제거

토토 결과은 리프 페이지 튜플(테이블 행을 가리키는 튜플)입니다.모두인덱싱된 키 열에는 동일한 인덱스에 있는 하나 이상의 다른 리프 페이지 튜플의 해당 열 값과 일치하는 값이 있습니다. 토토 결과 튜플은 실제로 매우 일반적입니다. B-트리 인덱스는 선택적 기술이 활성화된 경우 토토 결과에 대해 특별하고 공간 효율적인 표현을 사용할 수 있습니다.토토 결과 제거.

토토 결과 제거는 토토 결과된 튜플 그룹을 주기적으로 병합하여 단일을 형성하는 방식으로 작동합니다.게시 목록9782_9910TID9946_10317

참고

B-Tree 토토 결과 제거는 다음과 같이 효과적입니다.토토 결과NULL 값이 포함되어 있지만 NULL 값은 다음에 따라 결코 서로 동일하지 않습니다.=B-Tree 연산자 클래스의 구성원. 온디스크 B-트리 구조를 이해하는 구현 부분에 관한 한 NULL은 인덱스 값 도메인의 또 다른 값일 뿐입니다.

기존 리프 페이지에 맞지 않는 새 항목이 삽입되면 토토 결과 제거 프로세스가 느리게 발생합니다. 이렇게 하면 리프 페이지 분할이 방지되거나 최소한 지연됩니다. GIN 게시 목록 튜플과 달리 B-Tree 게시 목록 튜플은 새 복제본이 삽입될 때마다 확장할 필요가 없습니다. 이는 단지 리프 페이지의 원래 논리적 내용을 대체하는 물리적 표현일 뿐입니다. 이 설계는 혼합된 읽기-쓰기 워크로드에서 일관된 성능을 우선시합니다. 대부분의 클라이언트 애플리케이션은 토토 결과 제거를 사용하면 최소한 중간 정도의 성능 이점을 얻을 수 있습니다. 토토 결과 제거는 기본적으로 활성화되어 있습니다.

색인 생성그리고REINDEX토토 결과 제거를 적용하여 게시 목록 튜플을 생성합니다. 하지만 사용하는 전략은 약간 다릅니다. 테이블에서 가져온 정렬된 입력에서 발견된 토토 결과 일반 튜플의 각 그룹은 게시 목록 튜플로 병합됩니다.이전현재 보류 중인 리프 페이지에 추가 중입니다. 개별 게시 목록 튜플은 여러 개로 구성됩니다.TID가능한 한. 리프 페이지는 별도의 토토 결과 제거 패스 없이 일반적인 방식으로 작성됩니다. 이 전략은 다음에 적합합니다.색인 생성그리고REINDEX일회성 일괄 작업이기 때문입니다.

인덱스에 토토 결과 값이 거의 없거나 전혀 없기 때문에 토토 결과 제거의 이점을 누리지 못하는 쓰기 중심 작업 부하는 토토 결과 제거가 명시적으로 비활성화되지 않는 한 작고 고정된 성능 저하를 초래합니다.deduplicate_items스토리지 매개변수를 사용하여 개별 인덱스 내에서 토토 결과 제거를 비활성화할 수 있습니다. 게시 목록 튜플을 읽는 것은 적어도 표준 튜플 표현을 읽는 것만큼 효율적이므로 읽기 전용 워크로드에서는 성능 저하가 전혀 없습니다. 토토 결과 제거를 비활성화하는 것은 일반적으로 도움이 되지 않습니다.

B-트리 인덱스는 MVCC에 동일한 논리 테이블 행의 여러 기존 버전이 있을 수 있다는 사실을 직접 인식하지 못합니다. 인덱스에 대한 각 튜플은 자체 인덱스 항목이 필요한 독립 객체입니다.버전 토토 결과때때로 누적되어 쿼리 대기 시간 및 처리량에 부정적인 영향을 미칠 수 있습니다. 이는 일반적으로 다음과 같은 경우에 발생합니다.업데이트-대부분의 개별 업데이트가 적용할 수 없는 과중한 작업 부하최적화(종종 하나 이상의 색인화된 열이 수정되어 새로운 색인 튜플 버전 세트가 필요하기 때문에 - 하나의 새로운 튜플각각 모두색인). 실제로 B-Tree 토토 결과 제거는 버전 변동으로 인한 인덱스 팽창을 개선합니다. 고유 인덱스의 튜플도 반드시 그런 것은 아닙니다.물리적으로버전 변동으로 인해 디스크에 저장될 때 고유합니다. 토토 결과 제거 최적화는 고유 인덱스 내에서 선택적으로 적용됩니다. 버전 토토 결과이 있는 것으로 보이는 페이지를 대상으로 합니다. 높은 수준의 목표는 다음과 같습니다.진공그 전에 실행할 시간이 더 많습니다.불필요함버전 변동으로 인한 페이지 분할이 발생할 수 있습니다.

고유 인덱스의 토토 결과 제거 패스가 발생해야 하는지 여부를 결정하기 위해 특별한 경험적 방법이 적용됩니다. 종종 리프 페이지 분할로 바로 건너뛰어 도움이 되지 않는 토토 결과 제거 단계의 주기 낭비로 인한 성능 저하를 방지할 수 있습니다. 토토 결과 제거 오버헤드가 우려된다면 설정을 고려하세요.deduplicate_items = 꺼짐선택적으로. 고유 색인에서 토토 결과 제거를 활성화하면 단점이 거의 없습니다.

구현 수준 제한으로 인해 모든 경우에 토토 결과 제거를 사용할 수는 없습니다. 토토 결과 제거 안전성은 다음과 같은 경우에 결정됩니다.색인 생성또는REINDEX실행되었습니다.

토토 결과 제거는 안전하지 않은 것으로 간주되며 동일한 데이터 간에 의미상 중요한 차이가 있는 다음과 같은 경우에는 사용할 수 없습니다.

  • 텍스트, varchar문자다음의 경우 토토 결과 제거를 사용할 수 없습니다.비결정적콜레이션이 사용됩니다. 대소문자 및 악센트 차이는 동일한 데이텀 간에 유지되어야 합니다.

  • 숫자토토 결과 제거를 사용할 수 없습니다. 숫자 표시 배율은 동일한 데이텀 간에 유지되어야 합니다.

  • jsonb토토 결과 제거를 사용할 수 없습니다.jsonbB-트리 연산자 클래스 사용숫자내부적으로.

  • 플로트4그리고float8토토 결과 제거를 사용할 수 없습니다. 이러한 유형에는 다음과 같은 고유한 표현이 있습니다.-0그리고0그럼에도 불구하고 이는 동일한 것으로 간주됩니다. 이 차이는 보존되어야 합니다.

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

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

사용된 연산자 클래스 또는 데이터 정렬에 관계없이 적용되는 구현 수준 제한이 하나 더 있습니다.

  • 포함색인은 토토 결과 제거를 사용할 수 없습니다.

수정사항 제출

문서에 올바르지 않은 내용이 있으면 일치하지 않습니다. 특정 기능에 대한 경험이 있거나 추가 설명이 필요한 경우 이용해주세요이 양식문서 문제를 보고합니다.