컬럼스토어 인덱스 성능 (Columnsotre Index Performance)

 

  • Version : SQL Server 2012, 2014, 2016

 

SQL Server 2012부터 도입된 컬럼스토어 인덱스는 열 기반 데이터 저장소 및 열 기반 쿼리 처리를 사용하여 데이터를 저장하고 관리한다. 인덱스는 주로 대량 로드 및 전용 쿼리를 수행하는 데이터웨어하우징 작업에 효과적이다. 전체 테이블 검색을 사용하는 쿼리에서는 뛰어난 성능을 제공하지만 특정 값을 찾아 데이터를 검색하는 쿼리에는 부적합 하다.

 

자세한 내용은 MSDN을 참고한다.

 

일반 B-tree 인덱스와 컬럼스토어 인덱스의 성능에 대해서 비교해본다. 아래 스크립트는 테스트를 위한 테이블 생성 및 데이터 생성 스크립트이다. (꽤 오랜 시간동안 테스트 데이터가 생성된다.)

-- Create SampleData table

CREATE TABLE [dbo].[SampleData](

    [RowKey] [int] NOT NULL,

    [CreateDate] [int] NOT NULL,

    [OtherDate] [int] NOT NULL,

    [VarcharColumn1] [varchar](20) NULL,

    [VarcharColumn2] [varchar](20) NULL,

    [VarcharColumn3] [varchar](20) NULL,

    [VarcharColumn4] [varchar](20) NULL,

    [VarcharColumn5] [varchar](20) NULL,

    [IntColumn1] int NULL,

    [IntColumn2] int NULL,

    [IntColumn3] int NULL,

    [IntColumn4] int NULL,

    [IntColumn5] int NULL,

    [IntColumn6] int NULL,

    [IntColumn7] int NULL,

    [IntColumn8] int NULL,

    [IntColumn9] int NULL,

    [IntColumn10] int NULL,

    [FloatColumn1] float NULL,

    [FloatColumn2] float NULL,

    [FloatColumn3] float NULL,

    [FloatColumn4] float NULL,

    [FloatColumn5] float NULL    

)

GO

 

-- Load sample data into table

DECLARE @val INT

SELECT @val=1

WHILE @val < 5000000

BEGIN

INSERT INTO SampleData

VALUES (@val,

CAST(CONVERT(varchar,DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 365),

'2015-01-01'),112) as integer),

CAST(CONVERT(varchar,DATEADD(DAY, ABS(CHECKSUM(NEWID()) % 365),

'2015-01-01'),112) as integer),

'TEST' + cast(round(rand()*100,0) AS VARCHAR),

'TEST' + cast(round(rand()*100,0) AS VARCHAR),

'TEST' + cast(round(rand()*100,0) AS VARCHAR),

'TEST' + cast(round(rand()*100,0) AS VARCHAR),

'TEST' + cast(round(rand()*100,0) AS VARCHAR),

round(rand()*100000,0),

round(rand()*100000,0),     

round(rand()*100000,0),     

round(rand()*100000,0),     

round(rand()*100000,0),

round(rand()*100000,0),

round(rand()*100000,0),

round(rand()*100000,0),

round(rand()*100000,0),

round(rand()*100000,0),

     round(rand()*10000,2),

     round(rand()*10000,2),

     round(rand()*10000,2),

     round(rand()*10000,2),

     round(rand()*10000,2))

SELECT @val=@val+1

END

GO

 

 

데이터 생성이 완료 되었으면 성능 비교를 위해 B-tree 인덱스와 컬럼스토어 인덱스를 생성한다.

-- b-tree index

CREATE NONCLUSTERED INDEX IX_SampleData_Reg

ON SampleData (VarcharColumn1,FloatColumn1);

GO

 

-- column store index

CREATE NONCLUSTERED COLUMNSTORE INDEX IX_SampleData_ColStore

ON SampleData (VarcharColumn1,FloatColumn1);

GO

 

 

각 인덱스를 사용한 쿼리를 실행하여 성능을 측정한다. 실행 측정 결과는 프로파일러를 사용하였다.

-- column store query

SELECT VarcharColumn1,avg(FloatColumn1)

FROM SampleData GROUP BY VarcharColumn1

GO

 

-- b-tree query

SELECT VarcharColumn1,avg(FloatColumn1)

FROM SampleData GROUP BY VarcharColumn1

OPTION (TABLE HINT(SampleData, INDEX (IX_SampleData_Reg)))

GO

 

 

결과를 살펴보면 컬럼스토어 인덱스 성능이 훨씬 낫다는 것을 실험에서 확인할 수 있다.

 

[참고자료]

 




강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp





profile

강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

Kakao Talk : SQLMVP

Line : jevida


현재 LA에 거주하고 있으며 SQL에 관심있는 분이면 언제든 친추 환영합니다.