이 문서는 지원되지 않는 PostgreSQL 버전에 대한 것입니다.
다음에 대한 동일한 페이지를 보고 싶을 수도 있습니다.현재버전 또는 위에 나열된 다른 지원 버전 중 하나를 사용하세요.

66.1. 개요

포스트그레SQL완전히 충돌 복구가 가능한 영구 디스크 내 해시 인덱스 구현이 포함되어 있습니다. 잘 정의된 선형 순서가 없는 데이터 유형을 포함하여 모든 데이터 유형은 해시 인덱스로 인덱싱될 수 있습니다. 해시 토토 베이 인덱싱되는 데이터의 해시 값만 저장하므로 인덱싱되는 데이터 열의 크기에는 제한이 없습니다.

해시 인덱스는 단일 열 인덱스만 지원하며 고유성 검사를 허용하지 않습니다.

해시 인덱스는 다음만 지원합니다.=연산자이므로 범위 연산을 지정하는 WHERE 절은 해시 인덱스를 활용할 수 없습니다.

각 해시 인덱스 튜플은 실제 열 값이 아닌 4바이트 해시 값만 저장합니다. 결과적으로 UUID, URL 등과 같은 긴 데이터 항목을 인덱싱할 때 해시 토토 베이 B-트리보다 훨씬 작을 수 있습니다. 또한 열 값이 없으면 모든 해시 인덱스 스캔이 손실됩니다. 해시 토토 베이 비트맵 인덱스 스캔 및 역방향 스캔에 참여할 수 있습니다.

해시 토토 베이 더 큰 테이블에서 동일성 스캔을 사용하는 SELECT 및 UPDATE가 많은 작업 부하에 가장 최적화되어 있습니다. B-트리 인덱스에서 검색은 리프 페이지를 찾을 때까지 트리를 따라 내려가야 합니다. 수백만 개의 행이 있는 테이블에서 이러한 하강은 데이터에 대한 액세스 시간을 늘릴 수 있습니다. 해시 인덱스의 리프 페이지에 해당하는 페이지를 버킷 페이지라고 합니다. 이와 대조적으로 해시 인덱스를 사용하면 버킷 페이지에 직접 액세스할 수 있으므로 더 큰 테이블에서 인덱스 액세스 시간이 줄어들 가능성이 있습니다. 이러한 '논리적 I/O' 감소는 shared_buffers/RAM보다 큰 인덱스/데이터에서 더욱 두드러집니다.

해시 토토 베이 해시 값의 고르지 못한 분포에 대처하도록 설계되었습니다. 해시 값이 고르게 분포되어 있으면 버킷 페이지에 대한 직접 액세스가 잘 작동합니다. 삽입으로 인해 버킷 페이지가 가득 차면 추가 오버플로 페이지가 해당 특정 버킷 페이지에 연결되어 해당 해시 값과 일치하는 인덱스 튜플에 대한 저장소가 로컬로 확장됩니다. 쿼리 중에 해시 버킷을 스캔할 때 오버플로 페이지를 모두 스캔해야 합니다. 따라서 불균형 해시 토토 베이 실제로 일부 데이터의 경우 필요한 블록 액세스 수 측면에서 B-트리보다 나쁠 수 있습니다.

오버플로 사례의 결과로 해시 토토 베이 고유하고 거의 고유한 데이터 또는 해시 버킷당 행 수가 적은 데이터에 가장 적합하다고 말할 수 있습니다. 문제를 방지할 수 있는 한 가지 방법은 부분 인덱스 조건을 사용하여 인덱스에서 고유하지 않은 값을 제외하는 것이지만 이는 많은 경우에 적합하지 않을 수 있습니다.

B-트리와 마찬가지로 해시 토토 베이 간단한 인덱스 튜플 삭제를 수행합니다. 이는 삭제해도 안전한 것으로 알려진 인덱스 튜플(항목 식별자의 LP_DEAD 비트가 이미 설정된 항목)을 삭제하는 지연된 유지 관리 작업입니다. 삽입 시 페이지에 사용 가능한 공간이 없다고 판단되면 데드 인덱스 튜플을 제거하여 새 오버플로 페이지를 생성하지 않으려고 합니다. 해당 시점에 페이지가 고정되어 있으면 제거가 불가능합니다. VACUUM 중에도 데드 인덱스 포인터 삭제가 발생합니다.

가능하다면 VACUUM은 인덱스 튜플을 가능한 적은 수의 오버플로 페이지에 압축하여 오버플로 체인을 최소화하려고 시도합니다. 오버플로 페이지가 비어 있으면 오버플로 페이지를 다른 버킷에서 재사용하기 위해 재활용할 수 있지만 운영 체제에는 반환되지 않습니다. 현재 REINDEX로 재구축하는 것 외에는 해시 인덱스를 축소할 수 있는 방법이 없습니다. 버킷 수를 줄일 수 있는 조항도 없습니다.

해시 토토 베이 인덱스된 행 수가 증가함에 따라 버킷 페이지 수를 늘릴 수 있습니다. 해시 키-버킷 번호 매핑은 인덱스가 점진적으로 확장될 수 있도록 선택됩니다. 새 버킷이 인덱스에 추가되면 정확히 하나의 기존 버킷을 "분할"해야 하며 업데이트된 키-버킷 번호 매핑에 따라 일부 튜플이 새 버킷으로 전송됩니다.

확장이 전경에서 발생하므로 사용자 삽입 실행 시간이 늘어날 수 있습니다. 따라서 행 수가 급격히 증가하는 테이블에는 해시 인덱스가 적합하지 않을 수 있습니다.