Columnstore 인덱스 - 데이터 웨어하우스Columnstore indexes - data warehouse

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터 시작)아니요Azure SQL 데이터베이스아니요Azure SQL 데이터 웨어하우스아니요병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Columnstore 인덱스는 분할과 함께 SQL ServerSQL Server 데이터 웨어하우스를 만들기 위해 필수입니다.Columnstore indexes, in conjunction with partitioning, are essential for building a SQL ServerSQL Server data warehouse.

새로운 기능What’s new

SQL Server 2016SQL Server 2016 에서는 columnstore 성능 향상을 위해 다음 기능이 도입되었습니다. introduces these features for columnstore performance enhancements:

  • Always On은 읽기 가능 복제본에 대한 columnstore 인덱스 쿼리를 지원합니다.Always On supports querying a columnstore index on a readable secondary replica.

  • MARS(Multiple Active Result Sets)는 columnstore 인덱스를 지원합니다.Multiple Active Result Sets (MARS) supports columnstore indexes.

  • 새 동적 관리 뷰 sys.dm_db_column_store_row_group_physical_stats(Transact-SQL)는 행 그룹 수준에서 성능 문제 해결 정보를 제공합니다.A new dynamic management view sys.dm_db_column_store_row_group_physical_stats (Transact-SQL) provides performance troubleshooting information at the row group level.

  • Columnstore 인덱스에 대한 단일 스레드 쿼리는 일괄 처리 모드에서 실행할 수 있습니다.Single-threaded queries on columnstore indexes can run in batch mode. 이전에는 다중 스레드 쿼리만이 일괄 처리 모드로 실행할 수 있었습니다.Previously, only multi-threaded queries could run in batch mode.

  • SORT 연산자는 일괄 처리 모드에서 실행됩니다.The SORT operator runs in batch mode.

  • 여러 DISTINCT 연산은 일괄 처리 모드로 실행됩니다.Multiple DISTINCT operation runs in batch mode.

  • 이제 창 집계가 데이터베이스 호환성 수준 130에서 일괄 처리 모드로 실행됩니다.Window Aggregates now runs in batch mode for database compatibility level 130

  • 효율적인 집계 처리를 위한 집계 푸시다운입니다.Aggregate Pushdown for efficient processing of aggregates. 이는 모든 데이터베이스 호환성 수준에서 지원됩니다.This is supported on all database compatibility levels.

  • 효율적인 문자열 조건자 처리를 위한 문자열 조건자 푸시다운입니다.String predicate pushdown for efficient processing of string predicates. 이는 모든 데이터베이스 호환성 수준에서 지원됩니다.This is supported on all database compatibility levels.

  • 데이터베이스 호환성 수준 130에 대한 스냅숏 격리Snapshot isolation for database compatibility level 130

비클러스터형과 columnstore 인덱스를 결합하여 성능 향상Improve performance by combining nonclustered and columnstore indexes

SQL Server 2016SQL Server 2016부터 클러스터형 columnstore 인덱스에 대해 비클러스터형 인덱스를 정의할 수 있습니다.Beginning with SQL Server 2016SQL Server 2016, you can define nonclustered indexes on a clustered columnstore index.

예: 비클러스터형 인덱스를 사용하여 테이블 검색의 효율성 향상Example: Improve efficiency of table seeks with a nonclustered index

데이터 웨어하우스에서 테이블 검색의 효율성을 개선하려면 테이블 검색을 사용할 때 가장 성능이 좋은 쿼리를 실행하도록 설계된 비클러스터형 인덱스를 만들 수 있습니다.To improve efficiency of table seeks in a data warehouse, you can create a nonclustered index designed to run queries that perform best with table seeks. 예를 들어, 일치하는 값을 찾고 작은 범위의 값을 반환하는 쿼리는 columnstore 인덱스보다 btree 인덱스에 대해 성능이 더 좋습니다.For example, queries that look for matching values or return a small range of values will perform better against a btree index rather than a columnstore index. 왜냐하면 columnstore 인덱스를 통한 전체 테이블 검색이 필요하지 않으며 btree 인덱스를 통해 이진 검색을 수행하여 정확한 결과를 더 빠르게 반환하기 때문입니다.They don’t require a full table scan through the columnstore index and will return the correct result faster by doing a binary search through a btree index.

--BASIC EXAMPLE: Create a nonclustered index on a columnstore table.  

--Create the table  
CREATE TABLE t_account (  
    AccountKey int NOT NULL,  
    AccountDescription nvarchar (50),  
    AccountType nvarchar(50),  
    UnitSold int  
);  
GO  

--Store the table as a columnstore.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account;  
GO  

--Add a nonclustered index.  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  

예: 비클러스터형 인덱스를 사용하여 columnstore 테이블에 기본 키 제약 조건 적용Example: Use a nonclustered index to enforce a primary key constraint on a columnstore table

기본적으로 columnstore 테이블은 기본 키 제약 조건을 허용하지 않습니다.By design, a columnstore table does not allow a primary key constraint. 이제 columnstore 테이블에 비클러스터형 인덱스를 사용하여 기본 키 제약 조건을 적용할 수 있습니다.Now you can use a nonclustered index on a columnstore table to enforce a primary key constraint. 기본 키는 NULL이 아닌 열에 대한 UNIQUE 제약 조건에 해당하며 SQL Server는 UNIQUE 제약 조건을 비클러스터형 인덱스로 구현합니다.A primary key is equivalent to a UNIQUE constraint on a non-NULL column, and SQL Server implements a UNIQUE constraint as a nonclustered index. 이러한 사실을 결합하여 다음 예제에서는 NULL이 아닌 열 accountkey에 대해 UNIQUE 제약 조건을 정의합니다.Combining these facts, the following example defines a UNIQUE constraint on the non-NULL column accountkey. 그 결과는 NULL이 아닌 열에 대한 UNIQUE 제약 조건으로 기본 키 제약 조건을 적용하는 비클러스터형 인덱스입니다.The result is a nonclustered index that enforces a primary key constraint as a UNIQUE constraint on a non-NULL column.

다음으로, 테이블을 클러스터형 columnstore 인덱스로 변환합니다.Next, the table is converted to a clustered columnstore index. 변환 중에 비클러스터형 인덱스는 유지됩니다.During the conversion, the nonclustered index persists. 그 결과는 기본 키 제약 조건을 적용하는 비클러스터형 인덱스를 포함한 클러스터형 columnstore 인덱스입니다.The result is a clustered columnstore index with a nonclustered index that enforces a primary key constraint. Columnstore 테이블에 대한 업데이트 또는 삽입은 비클러스터형 인덱스에도 영향을 미치므로 UNIQUE 제약 조건 및 비 NULL을 위반하는 모든 연산은 전체 연산을 실패하게 만듭니다.Since any update or insert on the columnstore table will also affect the nonclustered index, all operations that violate the unique constraint and the non-NULL will cause the entire operation to fail.

그 결과는 두 인덱스에 대해 모두 기본 키 제약 조건을 적용하는 비클러스터형 인덱스를 포함한 columnstore 인덱스입니다.The result is a columnstore index with a nonclustered index that enforces a primary key constraint on both indexes.

--EXAMPLE: Enforce a primary key constraint on a columnstore table.   

--Create a rowstore table with a unique constraint.  
--The unique constraint is implemented as a nonclustered index.  
CREATE TABLE t_account (  
    AccountKey int NOT NULL,  
    AccountDescription nvarchar (50),  
    AccountType nvarchar(50),  
    UnitSold int,  

    CONSTRAINT uniq_account UNIQUE (AccountKey)  
);  

--Store the table as a columnstore.   
--The unique constraint is preserved as a nonclustered index on the columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account  

--By using the previous two steps, every row in the table meets the UNIQUE constraint  
--on a non-NULL column.  
--This has the same end-result as having a primary key constraint  
--All updates and inserts must meet the unique constraint on the nonclustered index or they will fail.  

--If desired, add a foreign key constraint on AccountKey.  

ALTER TABLE [dbo].[t_account]  
WITH CHECK ADD FOREIGN KEY([AccountKey]) REFERENCES my_dimension(Accountkey)  
;  

행 수준 및 행 그룹 수준의 잠금을 사용하여 성능 개선Improve performance by enabling row-level and row-group-level locking

Columnstore 인덱스 기능에 대한 비클러스터형 인덱스를 보완하기 위해 SQL Server 2016SQL Server 2016 는 선택, 업데이트 및 삭제 연산에 대해 세분화된 잠금 기능을 제공합니다.To complement the nonclustered index on a columnstore index feature, SQL Server 2016SQL Server 2016 offers granular locking capability for select, update, and delete operations. 쿼리는 비클러스터형 인덱스에 대한 인덱스 검색에 행 수준 잠금을 사용하고 columnstore 인덱스에 대한 전체 테이블 검색에 행 그룹 수준 잠금을 실행할 수 있습니다.Queries can run with row-level locking on index seeks against a nonclustered index and rowgroup-level locking on full table scans against the columnstore index. 이 특성을 통해 행 수준 및 행 그룹 수준 잠금을 적절히 사용하여 더 높은 읽기/쓰기 동시성을 달성합니다.Use this to achieve higher read/write concurrency by using row-level and rowgroup-level locking appropriately.

--Granular locking example  
--Store table t_account as a columnstore table.  
CREATE CLUSTERED COLUMNSTORE INDEX taccount_cci ON t_account  
GO  

--Add a nonclustered index for use with this example  
CREATE UNIQUE INDEX taccount_nc1 ON t_account (AccountKey);  
GO  

--Look at locking with access through the nonclustered index  
SET TRANSACTION ISOLATION LEVEL repeatable read;  
GO  

BEGIN TRAN  
    -- The query plan chooses a seek operation on the nonclustered index  
    -- and takes the row lock  
    SELECT * FROM t_account WHERE AccountKey = 100;  
END TRAN  

스냅숏 격리 및 커밋된 읽기 스냅숏 격리Snapshot isolation and read-committed snapshot isolations

트랜잭션 일관성을 보장하려면 스냅숏 격리(SI)를 사용하고 columnstore 인덱스에 대한 쿼리의 문 수준 일관성을 보장하려면 커밋된 읽기 스냅숏 격리(RCSI)를 사용합니다.Use snapshot isolation (SI) to guarantee transactional consistency, and read-committed snapshot isolations (RCSI) to guarantee statement level consistency for queries on columnstore indexes. 이렇게 하면 데이터 기록기를 차단하지 않고 쿼리를 실행할 수 있습니다.This allows the queries to run without blocking data writers. 이 비차단 동작 덕분에 복잡한 트랜잭션에 대한 교착 상태의 가능성이 크게 줄어듭니다.This non-blocking behavior also significantly reduces the likelihood of deadlocks for complex transactions. 자세한 내용은 MSDN의 SQL Server에서의 스냅숏 격리 를 참조하세요.For more information, see Snapshot Isolation in SQL Server on MSDN.

관련 항목:See Also

Columnstore 인덱스 가이드Columnstore Indexes Guide
Columnstore 인덱스 데이터 로드Columnstore Indexes Data Loading
Columnstore 인덱스 버전형 기능 요약Columnstore Indexes Versioned Feature Summary
Columnstore 인덱스 쿼리 성능 Columnstore Indexes Query Performance
실시간 운영 분석을 위한 Columnstore 시작 Get started with Columnstore for real time operational analytics
Columnstore 인덱스 조각 모음 Columnstore Indexes Defragmentation