데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

In-memory optimized table 사용되는 Hash Index

 

·         Version : SQL Server 2014 later

 

SQL Server에서 새롭게 추가된 Hash Index(해시 인덱스)  In-Memory optimized table(인메모리 최적화 테이블)에서 사용된다기본적으로 테이블의 행을 빠르게 찾고 읽으려면 인덱스가 필요하다.

해시 인덱스는 버킷의 컬렉션은 배열(Array) 구성된다해시 함수는 인덱스 키를 해시 인덱스의 해당 버킷으로 매핑한다아래 그림은  개의 인덱스가 해시 함수를 사용하여 해시 인덱스에 있는  개의 서로 다른 버킷에 매핑되는것을 나타낸다아래 그림에서 해시 함수 이름은 f(x)이다.

 


해시 인덱스에 사용되는 해시 함수의 특징은 아래와 같다.

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

·         해시 함수는 결정적이다동일한 인덱스 키는 항상 해시 인덱스의 동일한 버킷에 매핑된다.

·         여러 인덱스 키는 동일한 해시 버킷에 매핑할  있다.

·         해시 함수는 균형을 이룬다해시 버킷에 대한 인덱스 키값의 분포는 일반적으로 포아송 분포를 따른다.

 

포아송 분포는 균등한 분포가 아니다인덱스  값은 해시 버킷에 균등하게 분포되지 않는다예를 들어 n개의 해시 버킷에 대한 n개의 고유인덱스 키의 포아송 분포는 버킷을 대략적으로 삼등분 한다삼등분된 버킷 부분에는 공백하나의 인덱스  개의 인덱스 키가 각각 포함된다소수의 버킷에  개이상의 키가 포함된다두개의 인덱스 키가 동일한 해시 버킷에 매핑되면 해시 충돌(Collision) 발생한다 많은 숫자의 해시 충돌은 읽기 작업의 성능에 영향을 준다.

 

인메모리 해시 인덱스 구조는 메모리 포인터의 배열로 구성된다 버킷은  배열의 오프셋에 매핑된다배열의  버킷은 해당 해시 버킷의  번째 행을 가리킨다버킷의  행은  다음 행을 가리키기 때문에 다음 그림과 같이  해시 버킷에 대한  체인이 만들어 진다아래 그림은 행이 포함된  개의 버킷이 있다.

 


 위에서 두번째 버킷에는  개의 빨간색 행이 포함된다 번째 버킷에는 하나의 파란색 행이 포함된다 아래 버킷에는  개의 녹색 행이 포함된다이러한 행동은 동일한 행의 서로 다른 버전일  있다.

 

 

[참고자료]

https://docs.microsoft.com/en-us/sql/database-engine/hash-indexes?view=sql-server-2014

 

 

2018-08-29 / Sungwook Kang / http://sqlmvp.kr

 

SQL Server, MSSQL, Hash Index, 해시 인덱스인모메리 최적화 테이블, In-memory optimized table



출처: https://sqlmvp.tistory.com/1269?category=618825 [Database Lab]
No. Subject Author Date Views
2150 SQL Server 2019 에서 업그레이드된sp_estimate_data_compression_savings 프로시저 (컬럼스토어 압축율 예상) jevida(강성욱) 2019.03.26 521
2149 SQL Server 2019 에서 추가된sys.dm_db_page_info, sys.fn_PageResCracker 기능으로 대기 관련 정보 확인 jevida(강성욱) 2019.03.26 751
2148 SQL Server 2019에서 향상된 Rowstore batch mode jevida(강성욱) 2019.03.26 415
2147 SQL Server 2016부터 도입된 USE HINT를 사용한 추적 플래그 활성화 jevida(강성욱) 2019.03.26 433
» In-memory optimized table에 사용되는 Hash Index jevida(강성욱) 2019.03.26 387
2145 VM환경에서 AG를 구성하였을때VSS 백업 동작 변경 jevida(강성욱) 2019.03.25 394
2144 SQL Server 2016 향상된 가용성 그룹 – 데이터베이스 수준의 상태 탐지 장애조치 jevida(강성욱) 2019.03.25 417
2143 SQL Server 2016 대용량 데이터 로드시 최소 로깅(minimal logging) 과Batch Size jevida(강성욱) 2019.03.25 307
2142 SQL Server 설치시 발생하는 1638 오류 jevida(강성욱) 2019.03.25 409
2141 SQL Server 666코드의 고유 식별자 오류 jevida(강성욱) 2019.03.25 293
2140 SQL Server AlwaysOn synchronous-commit 환경에서 동기화 레이턴시 트러블슈팅 jevida(강성욱) 2019.03.25 348
2139 SQL Server Scheduling and Yielding 트러블슈팅 jevida(강성욱) 2019.03.25 349
2138 SQL Server 2016 Tempdb 경합(contention) 최적화 jevida(강성욱) 2019.03.25 431
2137 XEvent를 사용하여 Auto tuning 작업 모니터링 jevida(강성욱) 2019.03.25 442
2136 SQL Server In-Memory OLTP에 ASP.NET 세션 상태 저장하기 jevida(강성욱) 2019.03.25 349
2135 SQL Server에서 JSON 데이터 저장하기 jevida(강성욱) 2019.03.25 414
2134 Azure SQL에서 네트워크를 구성하는 방법 jevida(강성욱) 2019.03.25 231
2133 SQL Server 네이티브 컴파일된 저장 프로시저 성능 모니터링 jevida(강성욱) 2019.03.25 435
2132 SQL Server 2017 소규모 시스템에서 향상된 리소스 사용 jevida(강성욱) 2019.03.25 256
2131 클러스터 컬럼스토어 인덱스(Clusterd Columnstore Index)에서 대량 인서트 작업시 발생하는 래치 경합 최소화 트릭 jevida(강성욱) 2019.03.25 392





XE Login