다음을 통해 공유


데이터 웨어하우징의 열 저장소 인덱스

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAnalytics Platform System (PDW)Microsoft Fabric의 SQL 데이터베이스

Columnstore 인덱스는 분할과 함께 SQL Server 데이터 웨어하우스를 빌드하는 필수 요소입니다. 이 문서에서는 SQL 데이터베이스 엔진 사용하는 데이터 웨어하우징 디자인의 주요 사용 사례 및 예제에 중점을 둡니다.

데이터 웨어하우징의 주요 기능

SQL Server 2016(13.x)에서는 columnstore 성능 향상을 위해 다음과 같은 기능을 도입했습니다.

  • Always On 가용성 그룹은 읽기 가능한 보조 복제본에서 columnstore 인덱스 쿼리를 지원합니다.
  • MARS(Multiple Active Result Set)는 columnstore 인덱스를 지원합니다.
  • 새로운 동적 관리 뷰 sys.dm_db_column_store_row_group_physical_stats(Transact-SQL)는 행 그룹 수준에서 성능 문제 해결 정보를 제공합니다.
  • columnstore 인덱스의 모든 쿼리는 일괄 처리 모드에서 실행할 수 있습니다. 이전에는 병렬 쿼리만 일괄 처리 모드에서 실행할 수 있었습니다.
  • 정렬, 고유 정렬 및 고유 연산자는 일괄 처리 모드에서 실행됩니다.
  • 이제 창 집계는 데이터베이스 호환성 수준 130 이상에 대한 일괄 처리 모드로 실행됩니다.
  • 집계의 효율적인 처리를 위한 집계 푸시다운입니다. 모든 데이터베이스 호환성 수준에서 지원됩니다.
  • 문자열 조건자의 효율적인 처리를 위한 문자열 조건자 푸시다운입니다. 모든 데이터베이스 호환성 수준에서 지원됩니다.
  • 데이터베이스 호환성 수준 130 이상에서의 스냅샷 격리입니다.
  • 정렬된 클러스터형 columnstore 인덱스는 SQL Server 2022(16.x)에서 도입되었습니다. 자세한 내용은 CREATE COLUMNSTORE INDEX순서가 지정된 컬럼스토어 인덱스를 사용한 성능 튜닝를 참조하세요. 순서가 지정된 columnstore 인덱스 가용성에 대해서는 순서가 지정된 columnstore 인덱스 가용성을 참조하세요.

SQL Server 및 Azure SQL 버전 및 플랫폼의 새로운 기능에 대한 자세한 내용은 columnstore 인덱스의 새로운 기능을 참조하세요.

비클러스터형 인덱스와 columnstore 인덱스를 결합하여 성능 향상

SQL Server 2016(13.x)부터 클러스터 집합 열 저장소 인덱스에 행 저장소 비클러스터 인덱스를 만들 수 있습니다.

예: 비클러스터형 인덱스를 사용하여 테이블 검색의 효율성 향상

Data Warehouse에서 테이블 검색의 효율성을 개선하기 위해 테이블 검색에 가장 적합한 쿼리를 실행하도록 설계된 비클러스터형 인덱스를 만들 수 있습니다. 예를 들어 일치하는 값을 찾고 작은 범위의 값을 반환하는 쿼리는 columnstore 인덱스보다 B-트리 인덱스에 대해 성능이 더 좋습니다. columnstore 인덱스의 전체 검색이 필요하지 않으며 B-트리 인덱스로 이진 검색을 수행하여 올바른 결과를 더 빠르게 반환합니다.

--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
);

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

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

예: 비클러스터형 인덱스를 사용하여 columnstore 테이블에 기본 키 제약 조건을 적용합니다.

테이블에는 최대 하나의 클러스터형 인덱스가 있을 수 있으므로 클러스터형 columnstore 인덱스가 있는 테이블에는 클러스터형 기본 키 제약 조건이 있을 수 없습니다. columnstore 테이블에 기본 키 제약 조건을 만들려면 비클러스터형으로 선언해야 합니다.

다음 예제에서는 비클러스터형 기본 키 제약 조건이 있는 테이블을 만든 다음 테이블에 클러스터형 columnstore 인덱스가 만들어집니다. columnstore 테이블의 삽입 또는 업데이트도 비클러스터형 인덱스를 수정하므로 기본 키 제약 조건을 위반하는 모든 작업으로 인해 전체 작업이 실패합니다.

--Create a primary key constraint on a columnstore table.

--Create a rowstore table with a nonclustered primary key constraint.
CREATE TABLE t_account (
    AccountKey int NOT NULL,
    AccountDescription nvarchar (50),
    AccountType nvarchar(50),
    UnitSold int,
    CONSTRAINT pk_account PRIMARY KEY NONCLUSTERED (AccountKey)
);

--Convert the table to columnstore.
--The primary key constraint is preserved as a nonclustered index on the columnstore table.
CREATE CLUSTERED COLUMNSTORE INDEX t_account_cci ON t_account;

행 수준 및 행 그룹 수준 잠금을 사용하도록 설정하여 성능 향상

columnstore 인덱스 기능의 비클러스터형 인덱스를 보완하기 위해 SQL Server 2016(13.x)은 SELECT, UPDATE, 및 DELETE 작업에 대한 세분화된 잠금 기능을 제공합니다. 쿼리는 비클러스터형 인덱스를 사용한 인덱스 검색 시 행 수준 잠금을, 컬럼스토어 인덱스를 사용한 전체 테이블 스캔 시 행 그룹 수준 잠금을 통해 실행할 수 있습니다. 행 수준 및 행 그룹 수준 잠금을 적절하게 사용하여 읽기/쓰기 동시성을 높이려면 이 방법을 사용합니다.

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

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

--Look at locking with access through the nonclustered index
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;

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;
COMMIT TRAN;

스냅샷 격리 및 읽기 커밋된 스냅샷 격리

SI(스냅샷 격리)를 사용하여 트랜잭션 일관성을 보장하고, columnstore 인덱스 쿼리에 대한 문 수준 일관성을 보장하기 위해 RCSI(커밋된 스냅샷 격리)를 사용합니다. 이렇게 하면 데이터 기록기를 차단하지 않고 쿼리를 실행할 수 있습니다. 이 비차단 동작 덕분에 복잡한 트랜잭션에 대한 교착 상태의 가능성이 크게 줄어듭니다. 자세한 내용은 데이터베이스 엔진의 행 버전 관리 기반 격리 수준을 참조하세요.