클러스터 컬럼스토어 인덱스(Clusterd Columnstore Index)에서 대량 인서트 작업시 발생하는 래치 경합 최소화 트릭
· Version : SQL Server
Clustered Columnstore Index(CCI)에서 데이터를 로드 하는 일반적인 시나리오는 오버헤드가 적은 시간 (일반적으로 야간 시간)을 활용해서 수백만개의 행이 포함된 데이터 파일을 로드하는 것이다. 권장 되는 배치 사이즈는 batchsize >= 102400으로 데이터를 로드 하는것이다. 배치 사이즈에 대한 내용은 아래 링크를 참고 한다.
· 컬럼스토어 인덱스 대용량 데이터 로드 : http://sqlmvp.kr/220135847446
CCI는 동시 데이터 스트림을 동일한 델타 행 그룹으로 허용한다. 그러나 동시성을 높이면 더 많은 페이지 래치 경합이 발생한다. 각 델타 RG는 내부적으로 클러스터된 b-tree 인덱스로 구성되며 데이터로드는 단순하게 증가하는 클러스터된 인덱스 키 패턴을 따라 마지막 페이지에서 래치 경합이 발생한다.
· 컬럼스토어 인덱스 INSERT 작업과 동시성 : http://sqlmvp.kr/220132145097
· 컬럼스토어 인덱스 동시성 : http://sqlmvp.kr/220130069090
아래 스크립트는 CCI에 삽입된 숨겨진 키 값을 테스트하는 간단한 방법이다.
create table foo (c1 int) create clustered columnstore index foocci on foo go
insert into foo values (1) insert into foo values (2)
-- check the hidden clustering key index select %%physloc%% , * from foo |
위 값은 <rowgroup-id>, <tuple-id>를 나타내는 클리스터된 컬럼스토어 인덱스 행의 숨겨진 키 열을 나타낸다. <tuple-id>는 내부적으로 단순하게 증가하는 숫자로 생성되어 동시 삽입시 페이지 래치 경합을 초래한다.
이러한 경합 문제를 해결하기 위한 트릭으로Memory optimized 테이블을 사용할 수 있다. Memory optimized 테이블을 사용하면PAGE 구조 없이 메모리에 데이터를 유지하도록 구현되므로 마지막 페이지 경합이 제거된다.
이 트릭을 사용하여 Memory optimized 테이블은102400 행보다 큰 청크로 마이그레이션 하여 델타행 그룹을 사용하지 않을 수 있다.
[참고자료]
2018-06-11 / Sungwook Kang / http://sqlmvp.kr / http://sqlangeles.com
SQL Server, MS SQL, Columnstore Index, 컬럼스토어 인덱스, 인덱스 경합, 래치 경합, page latch contention, 대용량 데이터 로드, bulk data insert
출처: https://sqlmvp.tistory.com/1251?category=618825 [Database Lab]