다음을 통해 공유


클러스터형 Columnstore 인덱스 사용

SQL Server에서 클러스터형 columnstore 인덱스를 사용하기 위한 작업입니다.

columnstore 인덱스에 대한 개요는 Columnstore 인덱스 설명(설명)을 참조하세요.

클러스터형 columnstore 인덱스에 대한 자세한 내용은 클러스터형 Columnstore 인덱스 사용을 참조하세요.

목차

클러스터형 Columnstore 인덱스 만들기

클러스터형 columnstore 인덱스 만들기를 위해 먼저 rowstore 테이블을 힙 또는 클러스터형 인덱스로 만든 다음 CREATE CLUSTERED COLUMNSTORE INDEX(Transact-SQL) 문을 사용하여 테이블을 클러스터형 columnstore 인덱스로 변환합니다. 클러스터형 columnstore 인덱스가 클러스터형 인덱스와 동일한 이름을 갖도록 하려면 DROP_EXISTING 옵션을 사용합니다.

다음은 테이블을 힙으로 만든 다음 cci_Simple 클러스터형 columnstore 인덱스로 변환하는 예제입니다. 이렇게 하면 전체 테이블의 스토리지가 rowstore에서 columnstore로 변경됩니다.

CREATE TABLE T1(
    ProductKey [int] NOT NULL, 
    OrderDateKey [int] NOT NULL, 
    DueDateKey [int] NOT NULL, 
    ShipDateKey [int] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_T1 ON T1;
GO

자세한 예제는 CREATE CLUSTERED COLUMNSTORE INDEX(Transact-SQL)의 예제 섹션을 참조하세요.

클러스터형 Columnstore 인덱스 삭제

DROP INDEX(Transact-SQL) 문을 사용하여 클러스터형 columnstore 인덱스 삭제 이 작업을 수행하면 인덱스가 삭제되고 columnstore 테이블이 rowstore 힙으로 변환됩니다.

클러스터형 Columnstore 인덱스로 데이터 로드

표준 로드 방법을 사용하여 기존 클러스터형 columnstore 인덱스로 데이터를 추가할 수 있습니다. 예를 들어 bcp 대량 로드 도구, Integration Services 및 INSERT ... SELECT는 모두 클러스터형 columnstore 인덱스로 데이터를 로드할 수 있습니다.

클러스터된 컬럼스토어 인덱스는 컬럼스토어에서 열 세그먼트의 단편화를 방지하기 위해 델타스토어를 활용합니다.

분할된 테이블로 로드하기

분할된 데이터의 경우 SQL Server는 먼저 파티션에 각 행을 할당한 다음 파티션 내의 데이터에 대해 columnstore 작업을 수행합니다. 각 파티션에는 자체 행 그룹과 하나 이상의 deltastore가 있습니다.

Deltastore 로드 시나리오

행 수가 행 그룹에 허용되는 최대 행 수가 될 때까지 행이 deltastore에 누적됩니다. deltastore에 행 그룹당 최대 행 수가 포함된 경우 SQL Server는 행 그룹을 "CLOSED"로 표시합니다. "튜플 이동기"라는 백그라운드 프로세스는 CLOSED 행 그룹을 찾아 columnstore로 이동합니다. 여기서 행 그룹은 열 세그먼트로 압축되고 열 세그먼트는 columnstore에 저장됩니다.

각 클러스터형 columnstore 인덱스에 대해 여러 델타 저장소가 있을 수 있습니다.

  • deltastore가 잠겨 있는 경우 SQL Server는 다른 deltastore에 대한 잠금을 가져오려고 합니다. 사용할 수 있는 델타 저장소가 없으면 SQL Server에서 새 deltastore를 만듭니다.

  • 분할된 테이블의 경우 각 파티션에 대해 하나 이상의 델타 저장소가 있을 수 있습니다.

클러스터형 columnstore 인덱스의 경우에만 다음 시나리오에서는 로드된 행이 columnstore로 직접 이동하거나 deltastore로 이동하는 경우를 설명합니다.

이 예제에서 각 행 그룹에는 행 그룹당 102,400~1,048,576개의 행이 있을 수 있습니다.

대량 로드할 행 Columnstore에 추가된 행 Deltastore에 추가된 행
102,000 0 102,000
145,000 145,000

행 그룹 크기: 145,000
0
1,048,577 1,048,576

행 그룹 크기: 1,048,576
1
2,252,152 2,252,152

행 그룹 크기: 1,048,576, 1,048,576, 155,000.
0

다음 예제에서는 파티션에 1,048,577개의 행을 로드한 결과를 보여 줍니다. 결과는 columnstore에서 압축된 행 그룹 1개(압축된 열 세그먼트)와 deltastore의 행 1개를 보여줍니다.

SELECT * FROM sys.column_store_row_groups;

일괄 처리 로드에 대한 행 그룹 및 deltastore

클러스터형 Columnstore 인덱스 데이터 변경

클러스터형 columnstore 인덱스는 DML 삽입, 업데이트 및 삭제 작업을 지원합니다.

INSERT(Transact-SQL)를 사용하여 행을 삽입합니다. 행이 deltastore에 추가됩니다.

DELETE(Transact-SQL)를 사용하여 행을 삭제합니다.

  • 행이 columnstore에 있는 경우 SQL Server는 행을 논리적으로 삭제된 것으로 표시하지만 인덱스가 다시 작성될 때까지 행의 실제 스토리지를 회수하지 않습니다.

  • 행이 deltastore에 있는 경우 SQL Server는 행을 논리적으로 물리적으로 삭제합니다.

UPDATE(Transact-SQL)를 사용하여 행을 업데이트합니다.

  • 행이 columnstore에 있는 경우 SQL Server는 행을 논리적으로 삭제된 것으로 표시한 다음 업데이트된 행을 deltastore에 삽입합니다.

  • 행이 deltastore에 있는 경우 SQL Server는 deltastore의 행을 업데이트합니다.

클러스터형 Columnstore 인덱스 다시 작성

CREATE CLUSTERED COLUMNSTORE INDEX(Transact-SQL) 또는 ALTER INDEX(Transact-SQL)를 사용하여 기존 클러스터형 columnstore 인덱스의 전체 다시 빌드를 수행합니다. 또한 ALTER INDEX를 사용할 수 있습니다. REBUILD를 사용하여 특정 파티션을 다시 빌드합니다.

프로세스 다시 작성

클러스터형 columnstore 인덱스 다시 작성을 위해 SQL Server:

  • 다시 빌드가 발생하는 동안 테이블 또는 파티션에 대한 배타적 잠금을 획득합니다. 데이터는 "오프라인"이며 다시 빌드하는 동안 사용할 수 없습니다.

  • 테이블에서 논리적으로 삭제된 행을 물리적으로 삭제하여 columnstore를 조각 모음합니다. 삭제된 바이트는 실제 미디어에서 회수됩니다.

  • 인덱스를 다시 작성하기 전에 deltastore의 rowstore 데이터를 columnstore의 데이터와 병합합니다. 다시 작성이 완료되면 모든 데이터가 columnstore 형식으로 저장되고 deltastore는 비어 있습니다.

  • 모든 데이터를 columnstore로 다시 압축합니다. 다시 빌드가 진행되는 동안 columnstore 인덱스의 두 복사본이 있습니다. 다시 작성이 완료되면 SQL Server는 원래 columnstore 인덱스를 삭제합니다.

클러스터형 Columnstore 인덱스 다시 작성을 위한 권장 사항

클러스터형 columnstore 인덱스를 다시 빌드하면 조각화를 제거하고 모든 행을 columnstore로 이동하는 데 유용합니다. 다음과 같은 권장 사항이 있습니다.

  • 전체 테이블 대신 파티션을 다시 빌드합니다.

    1. 인덱스가 크면 전체 테이블을 다시 빌드하는 데 시간이 오래 걸리며 다시 빌드하는 동안 인덱스의 추가 복사본을 저장할 충분한 디스크 공간이 필요합니다. 일반적으로 가장 최근에 사용한 파티션을 다시 빌드하기만 하면 됩니다.

    2. 분할된 테이블의 경우 조각화가 최근에 수정된 파티션에서만 발생할 수 있으므로 전체 columnstore 인덱스를 다시 작성할 필요가 없습니다. 팩트 테이블과 큰 차원 테이블은 일반적으로 테이블 청크에서 백업 및 관리 작업을 수행하기 위해 분할됩니다.

  • 많은 DML 작업 후에 파티션을 다시 빌드합니다.

    파티션을 다시 빌드하면 파티션이 조각 모음되고 디스크 스토리지가 줄어듭니다. 다시 빌드하면 삭제로 표시된 columnstore에서 모든 행이 삭제되고 deltastore의 모든 행이 columnstore로 이동합니다.

  • 데이터를 로드한 후 파티션을 다시 빌드합니다.

    이렇게 하면 모든 데이터가 columnstore에 저장됩니다. 여러 로드가 동시에 발생하면 각 파티션에 여러 델타 저장소가 있을 수 있습니다. 다시 빌드하면 모든 deltastore 행이 columnstore로 이동합니다.

클러스터형 Columnstore 인덱스 다시 구성

클러스터형 columnstore 인덱스를 다시 구성하면 모든 CLOSED 행 그룹이 columnstore로 이동합니다. 재구성을 수행하려면 REORGANIZE 옵션과 함께 ALTER INDEX(Transact-SQL)를 사용합니다.

CLOSED 행 그룹을 columnstore로 이동하기 위해 재구성이 필요하지 않습니다. 튜플 이동기 프로세스는 결국 모든 CLOSED 행 그룹을 찾아 이동합니다. 그러나 튜플 이동기는 단일 스레드로 작동하며, 워크로드에 맞추어 행 그룹을 충분히 빠르게 이동시키지 못할 수 있습니다.

재구성에 대한 권장 사항

클러스터형 columnstore 인덱스 다시 구성 시기:

  • 하나 이상의 데이터를 로드한 후 클러스터형 columnstore 인덱스를 다시 구성하여 쿼리 성능 이점을 최대한 빨리 달성합니다. 다시 구성하려면 처음에는 데이터를 압축하기 위해 추가 CPU 리소스가 필요하므로 전체 시스템 성능이 저하될 수 있습니다. 그러나 데이터가 압축되는 즉시 쿼리 성능이 향상될 수 있습니다.