다음을 통해 공유


클러스터형 columnstore 인덱스 사용

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

columnstore 인덱스에 대한 개요는 Columnstore Indexes Described를 참조하십시오.

클러스터형 columnstore 인덱스에 대한 자세한 내용은 Using Clustered Columnstore Indexes을 참조하십시오.

콘텐츠

클러스터형 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 인덱스로 데이터를 로드할 수 있습니다.

클러스터형 columnstore 인덱스는 columnstore의 열 세그먼트 조각화를 방지하기 위해 deltastore를 활용합니다.

분할된 테이블로 로드

분할된 데이터에 대해 SQL Server 에서는 먼저 각 행을 파티션에 할당한 다음 파티션 내에서 데이터에 columnstore 작업을 수행합니다. 각 파티션에는 고유한 행 그룹 수와 적어도 하나의 deltastore가 있습니다.

Deltastore 로드 시나리오

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

클러스터형 columnstore 인덱스마다 여러 deltastore가 있을 수 있습니다.

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

  • 분할된 테이블의 경우 각 파티션에 대해 하나 이상의 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에 COMPRESSED 행 그룹이 하나 있고(열 세그먼트로 압축됨) 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가 생길 수 있습니다. 다시 작성 시 deltastore의 모든 행이 columnstore로 이동됩니다.

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

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

CLOSED 행 그룹을 columnstore로 이동할 경우에는 다시 구성할 필요가 없습니다. tuple-mover 프로세스에서 모든 CLOSED 행 그룹을 찾아서 이동합니다. 하지만 tuple-mover는 단일 스레드이므로 작업에 맞게 충분히 빠르게 행 그룹을 이동하지 못할 수 있습니다.

재구성 관련 권장 사항

클러스터형 columnstore 인덱스를 다시 구성해야 하는 경우:

  • 하나 이상의 데이터 로드 후에는 최대한 빠르게 쿼리 성능 장점을 얻기 위해 클러스터형 columnstore 인덱스를 다시 구성합니다. 다시 구성하려면 처음에 데이터를 압축하기 위한 추가 CPU 리소스가 필요하므로 전체 시스템 성능이 느려질 수 있습니다. 하지만 데이터가 압축되는 즉시 쿼리 성능을 향상할 수 있습니다.