다음을 통해 공유


해시 인덱스

인덱스는 메모리 최적화 테이블의 진입점으로 사용됩니다. 테이블에서 행을 읽으려면 메모리의 데이터를 찾으려면 인덱스가 필요합니다.

해시 인덱스는 배열로 구성된 버킷 컬렉션으로 구성됩니다. 해시 함수는 해시 인덱스의 해당 버킷에 인덱스 키를 매핑합니다. 다음 그림에서는 해시 인덱스의 세 개의 서로 다른 버킷에 매핑되는 세 개의 인덱스 키를 보여 줍니다. 예를 들어 해시 함수 이름은 f(x)입니다.

다른 버킷에 매핑된 인덱스 키입니다.

해시 인덱스에 사용되는 해시 함수에는 다음과 같은 특징이 있습니다.

  • SQL Server에는 모든 해시 인덱스에 사용되는 해시 함수가 하나 있습니다.

  • 해시 함수는 결정적입니다. 동일한 인덱스 키는 항상 해시 인덱스 내 동일한 버킷에 매핑됩니다.

  • 여러 인덱스 키를 동일한 해시 버킷에 매핑할 수 있습니다.

  • 해시 함수는 균형이 조정됩니다. 즉, 해시 버킷에 대한 인덱스 키 값의 분포는 일반적으로 포아송 분포를 따릅니다.

    포아송 분포는 짝수 분포가 아닙니다. 인덱스 키 값은 해시 버킷에 균등하게 분산되지 않습니다. 예를 들어 n 해시 버킷을 통해 n 개의 고유 인덱스 키를 푸아송 분포하면 약 1/3의 빈 버킷, 하나의 인덱스 키를 포함하는 버킷의 3분의 1, 인덱스 키 2개가 포함된 다른 세 번째 버킷이 생성됩니다. 적은 수의 버킷에는 두 개 이상의 키가 포함됩니다.

두 개의 인덱스 키가 동일한 해시 버킷에 매핑되는 경우 해시 충돌이 있습니다. 많은 수의 해시 충돌이 읽기 작업에 성능에 영향을 미칠 수 있습니다.

메모리 내 해시 인덱스 구조는 메모리 포인터 배열로 구성됩니다. 각 버킷은 이 배열의 오프셋에 매핑됩니다. 배열의 각 버킷은 해당 해시 버킷의 첫 번째 행을 가리킵니다. 버킷의 각 행은 다음 행을 가리키므로 다음 그림과 같이 각 해시 버킷에 대한 행 체인이 생성됩니다.

메모리 내 해시 인덱스 구조입니다.

그림에는 세 개의 버킷이 행으로 배열되어 있습니다. 위쪽의 두 번째 버킷에는 세 개의 빨간색 행이 포함됩니다. 네 번째 버킷에는 단일 파란색 행이 포함됩니다. 아래쪽 버킷에는 두 개의 녹색 행이 포함됩니다. 이러한 행은 동일한 행의 다른 버전일 수 있습니다.

메모리 최적화 테이블의 인덱스에 대한 자세한 내용은 Memory-Optimized 테이블에서 인덱스를 사용하기 위한 지침을 참조하세요.

또한 참조하십시오

Memory-Optimized 테이블의 인덱스