컬럼스토어 인덱스 동시성
Column Store Index Concurrency and Isolation Levels
- Version : SQL Server 2012, 2014
클러스터 컬럼 스토어와 동시성
클러스터 컬럼스토어 인덱스(Clustered column index(CCI))는 기본적으로 데이터웨어하우스 시나리오에 기반하여 디자인 되어 있다.
- 한 번 쓰고 여러 번 읽기 : CCI는 쿼리 성능에 최적화 되어 있다. 이는 기둥 형식으로 압축된 데이터에서 필요한 컬럼만 가져와서 성능을 높인다.
- 대량 데이터 가져오기 및 세류(천천히) 데이터 로드 : 인서트 오퍼레이션
INSERT / UPDATE를 지원하지만 이러한 작업은 대량의 작업에 최적화 되어 있지 않다. 사실 동시성 경우 DELETE / UPDATE 경우 블록킹이 발생 할 수 있으며 대량의 delta row groups로 이어질 수 있다. 동시성 모델에는 새로운 잠금 리소스 ROWGROUP이 있다.
잠금이 발생하는 시나리오에 대해 트랜잭션 격리 수준으로 알아 보자.
트랜잭션 격리 수준 지원 (Transaction Isolation levels Supported)
- Read Uncommitted : 대부분 DW 쿼리에 대한 작업이며 쿼리가 실행 되는 동안 PDW 어플라이언스에서 CCI에 엑세스할 때 read uncommitted 로 DML에 대한 동시성이 차단되지 않도록 한다.
- Read Committed : 잠금 기반으로 실행되며 DML에 대한 블록킹을 제공한다.
RCSI는 하나 이상의 CCI 테이블을 포함하여 사용하는 경우 CCI 이외의 모든 테이블은 read committed 격리 수준에서 non-blocking 의미로 액세스 할 수 있다. 하지만 CCI는 불가능하다.
If RCSI is enabled on the database containing one or more tables with CCI, all tables other than CCI can be accessed with non-blocking semantics under read committed isolation level but not for CCI |
Example : SQL Server 2014
select is_read_committed_snapshot_on, snapshot_isolation_state_desc,snapshot_isolation_state from sys.databases where name='AdventureWorksDW2012' |
CREATE TABLE [dbo].[T_ACCOUNT]( [accountkey] [int] IDENTITY(1,1) NOT NULL, [accountdescription] [nvarchar](50) NULL ) ON [PRIMARY]
-- create a CCI CREATE CLUSTERED COLUMNSTORE INDEX ACCOUNT_CCI ON T_ACCOUNT |
세션 1 | 세션 2 | 세션3 |
use AdventureWorksDW2012 go
-- Do a DML transaction on CCI but don't commit begin tran insert into T_ACCOUNT (accountdescription ) values ('value-1'); | ||
set transaction isolation level read committed go
select * from t_account --You will see CCI query is blocked on session-1 as shown using the query below | ||
select request_session_id as spid, resource_type as rt, resource_database_id as rdb, (case resource_type WHEN 'OBJECT' then object_name(resource_associated_entity_id) WHEN 'DATABASE' then ' ' ELSE (select object_name(object_id) from sys.partitions where hobt_id=resource_associated_entity_id) END) as objname, resource_description as rd, request_mode as rm, request_status as rs from sys.dm_tran_locks |
이 데이터베이스는 기본적으로 non-blocking read committed 격리 수준의 행 버전 관리를 사용하지만 CCI는 잠금 기반의 read committed로 접근한다.
- Snapshot Isolation : 이는 CCI를 포함하는 데이터베이스에서 사용 할 수 있다. CCI 이외의 디스크 기반 테이블은 스냅샷 격리에서 액세스 할 수 있지만 CCI에 대한 액세스가 허용되지 않으며 다음과 같은 에러가 발생한다.
Msg 35371, Level 16, State 1, Line 26 SNAPSHOT isolation level is not supported on a table which has a clustered columnstore index. |
- Repeatable Read : CCI에서 지원
set transaction isolation level repeatable read go
begin tran select * from t_account |
Serializable : CCI에서 지원
set transaction isolation level serializable go
begin tran select * from t_account go |
[참고자료]
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp