CREATE COLUMNSTORE INDEX(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics AnalyticsPlatform System(PDW)

rowstore 테이블을 클러스터형 columnstore 인덱스로 변환하거나 비클러스터형 columnstore 인덱스를 만듭니다. columnstore 인덱스를 사용하여 OLTP 워크로드에서 실시간 운영 분석을 효율적으로 실행하거나 데이터웨어 하우징 워크로드에 대한 데이터 압축 및 쿼리 성능을 향상시킵니다.

이 기능의 최신 개선 사항은 columnstore 인덱스의 새로운 기능을 따르세요.

  • 정렬된 클러스터형 columnstore 인덱스는 SQL Server 2022(16.x)에 도입되었습니다. 자세한 내용은 COLUMNSTORE 인덱스 만들기를 참조하세요.

  • SQL Server 2016(13.x)부터 테이블을 클러스터형 columnstore 인덱스로 만들 수 있습니다. 더 이상 rowstore 테이블을 먼저 만들고 클러스터형 columnstore 인덱스로 변환할 필요가 없습니다.

  • columnstore 인덱스 디자인 지침에 대한 자세한 내용은 Columnstore 인덱스 - 디자인 참고 자료를 참조하세요.

Transact-SQL 구문 표기 규칙

구문

SQL Server 및 Azure SQL Database에 대한 구문:

-- Create a clustered columnstore index on disk-based table.
CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ORDER (column [ , ...n ] ) ]
    [ WITH ( <with_option> [ , ...n ] ) ]
    [ ON <on_option> ]
[ ; ]

-- Create a nonclustered columnstore index on a disk-based table.
CREATE [ NONCLUSTERED ]  COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
        ( column  [ , ...n ] )
    [ WHERE <filter_expression> [ AND <filter_expression> ] ]
    [ WITH ( <with_option> [ , ...n ] ) ]
    [ ON <on_option> ]
[ ; ]

<with_option> ::=
      DROP_EXISTING = { ON | OFF } -- default is OFF
    | MAXDOP = max_degree_of_parallelism
    | ONLINE = { ON | OFF }
    | COMPRESSION_DELAY  = { 0 | delay [ MINUTES ] }
    | DATA_COMPRESSION = { COLUMNSTORE | COLUMNSTORE_ARCHIVE }
      [ ON PARTITIONS ( { partition_number_expression | range } [ , ...n ] ) ]

<on_option>::=
      partition_scheme_name ( column_name )
    | filegroup_name
    | "default"

<filter_expression> ::=
      column_name IN ( constant [ , ...n ]
    | column_name { IS | IS NOT | = | <> | != | > | >= | !> | < | <= | !< } constant )

Azure Synapse Analytics, 병렬 Data Warehouse, SQL Server 2022(16.x) 이상 버전에 대한 구문:

CREATE CLUSTERED COLUMNSTORE INDEX index_name
    ON { database_name.schema_name.table_name | schema_name.table_name | table_name }
    [ ORDER ( column [ , ...n ] ) ]
    [ WITH ( DROP_EXISTING = { ON | OFF } ) ] -- default is OFF
[;]

참고 항목

SQL Server 2014(12.x) 및 이전 버전에 대한 Transact-SQL 구문을 보려면 이전 버전 설명서를 참조 하세요.

인수

일부 옵션은 일부 데이터베이스 엔진 버전에서 사용하지 못할 수 있습니다. 다음 표에서는 CLUSTERED COLUMNSTORE 및 NONCLUSTERED COLUMNSTORE 인덱스에 옵션이 도입된 버전을 보여 줍니다.

옵션 CLUSTERED NONCLUSTERED
COMPRESSION_DELAY SQL Server 2016(13.x) SQL Server 2016(13.x)
DATA_COMPRESSION SQL Server 2016(13.x) SQL Server 2016(13.x)
ONLINE SQL Server 2019 (15.x) SQL Server 2017(14.x)
WHERE 절 해당 없음 SQL Server 2016(13.x)

모든 옵션을 Azure SQL Database에서 사용할 수 있습니다.

CREATE CLUSTERED COLUMNSTORE INDEX

모든 데이터가 압축되고 열로 저장되는 클러스터형 columnstore 인덱스를 만듭니다. 인덱스에 테이블의 모든 열이 포함되고 전체 테이블이 저장됩니다. 기존 테이블이 힙 또는 클러스터형 인덱스인 경우 클러스터형 columnstore 인덱스로 변환됩니다. 테이블이 클러스터형 columnstore 인덱스로 이미 저장된 경우 기존 인덱스가 삭제되고 다시 작성됩니다.

index_name

새 인덱스에 대한 이름을 지정합니다.

테이블에 클러스터형 columnstore 인덱스가 이미 있다면 같은 이름을 기존 인덱스로 지정하거나 DROP EXISTING 옵션을 사용하여 새 이름을 지정할 수 있습니다.

ON [ database_name. [ schema_name ] . | schema_name . ] table_name

클러스터형 columnstore 인덱스로 저장할 테이블의 한, 두 또는 세 부분으로 이루어진 이름을 지정합니다. 테이블이 힙이거나 테이블에 클러스터형 인덱스가 있는 경우 테이블이 rowstore에서 columnstore로 변환됩니다. 테이블이 이미 columnstore인 경우 이 명령문은 클러스터형 columnstore 인덱스를 다시 작성합니다.

ORDER

Azure Synapse Analytics, Analytics Platform System(PDW) 및 SQL Server 2022(16.x) 이상에 적용

column_store_order_ordinal sys.index_columns 열을 사용하여 클러스터형 columnstore 인덱스의 열 순서를 확인합니다. 이는 특히 문자열 데이터에서 세그먼트 제거를 지원합니다. 자세한 내용은 순서가 지정된 클러스터형 columnstore 인덱스 및 Columnstore 인덱스를 사용한 성능 튜닝 - 디자인 지침을 참조하세요.

순서가 지정된 클러스터형 columnstore 인덱스로 변환하려면 기존 인덱스가 클러스터형 columnstore 인덱스여야 합니다. DROP_EXISTING 옵션을 사용합니다.

LOB 데이터 형식((최대) 길이 데이터 형식)은 정렬된 클러스터형 columnstore 인덱스의 키가 될 수 없습니다.

정렬된 클러스터형 columnstore 인덱스 생성 시 CREATE INDEX 문의 기간이 상당히 긴 대신 CREATE INDEX 문을 사용하여 최고 품질의 정렬에 OPTION(MAXDOP = 1)를 사용합니다. 가능한 한 빨리 인덱스 만들기를 위해 MAXDOP를 제한하지 않고 서버에서 제공할 수 있는 모든 병렬 스레딩을 사용합니다. 가장 높은 수준의 압축 및 정렬은 columnstore 인덱스의 쿼리에 도움이 될 수 있습니다.

정렬된 클러스터형 columnstore 인덱스를 만들면 키 열이 sys.index_columnscolumn_store_order_ordinal 열로 표시됩니다.

WITH 옵션

DROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON은 기존 인덱스를 삭제하고 새로운 columnstore 인덱스를 생성하도록 지정합니다.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (DROP_EXISTING = ON);

기본값인 DROP_EXISTING = OFF는 인덱스 이름이 기존 이름과 동일한 것으로 생각합니다. 지정된 인덱스 이름이 이미 존재하는 경우 오류가 발생합니다.

MAXDOP = max_degree_of_parallelism

이 옵션은 인덱스 작업 중에 기존 최대 병렬 처리 수준 서버 구성을 재정의할 수 있습니다. MAXDOP를 사용하여 병렬 계획 실행에 사용되는 프로세서 수를 제한할 수 있습니다. 최대값은 64개입니다.

max_degree_of_parallelism 값은 다음 중 하나일 수 있습니다.

  • 1. 즉, 병렬 계획 생성을 억제합니다.
  • >1, 즉, 병렬 인덱스 작업에 사용되는 최대 프로세서 수를 현재 시스템 작업에 따라 지정된 수 또는 더 적은 수로 제한합니다. 예를 들어, MAXDOP = 4인 경우 사용되는 프로세서 수는 4개 이하가 됩니다.
  • 0(기본값), 즉, 현재 시스템 작업에 따라 실제 프로세서 수 이하의 프로세서를 사용합니다.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH (MAXDOP = 2);

자세한 내용은 최대 병렬 처리 수준 구성(서버 구성 옵션)병렬 인덱스 작업 구성을 참조하세요.

COMPRESSION_DELAY = 0 | delay [ MINUTES ]

디스크 기반 테이블의 경우 delay은 CLOSED 상태의 델타 rowgroup이 델타 rowgroup에 남아 있어야 하는 최소 시간(분)을 지정합니다. 그런 다음 SQL Server가 이를 압축된 rowgroup으로 압축할 수 있습니다. 디스크 기반 테이블은 개별 행의 삽입 및 업데이트 시간을 추적하지 않으므로 SQL Server가 CLOSED 상태의 델타 rowgroup에 지연을 적용합니다.

기본값은 0분입니다.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( COMPRESSION_DELAY = 10 MINUTES );

COMPRESSION_DELAY 사용 시기에 관한 권장 사항은 실시간 운영 분석을 위한 Columnstore 시작을 참조하세요.

DATA_COMPRESSION = COLUMNSTORE | COLUMNSTORE_ARCHIVE

지정된 테이블, 파티션 번호 또는 파티션 범위에 대한 데이터 압축 옵션을 지정합니다. 옵션은 다음과 같습니다.

  • COLUMNSTORE는 기본값이고 성능이 가장 우수한 columnstore 압축으로 압축하도록 지정합니다. 이 옵션은 일반적인 선택입니다.
  • COLUMNSTORE_ARCHIVE는 테이블 또는 파티션을 보다 작은 크기로 더욱 압축합니다. 이 옵션을 스토리지 크기가 더 작고 스토리지 및 검색에 더 많은 시간을 할애할 수 있는 아카이브와 같은 상황에 사용합니다.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( DATA_COMPRESSION = COLUMNSTORE_ARCHIVE );

압축에 대한 자세한 내용은 데이터 압축을 참조하세요.

ONLINE = [ON | OFF]
  • ON은 인덱스의 새 복사본을 만드는 동안 columnstore 인덱스가 온라인 상태를 유지하고 사용할 수 있도록 지정합니다.
  • OFF는 새 복사본을 만드는 동안 인덱스를 사용할 수 없도록 지정합니다.
CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
WITH ( ONLINE = ON );

ON 옵션

이 옵션으로 파티션 구성표, 특정 파일 그룹, 기본 파일 그룹 등의 데이터 스토리지 옵션을 지정할 수 있습니다. ON 옵션을 지정하지 않으면 기존 테이블의 파일 그룹 설정이나 설정 파티션이 인덱스에 사용됩니다.

partition_scheme_name( column_name )은 테이블의 파티션 구성표를 지정합니다. 파티션 구성표가 데이터베이스에 이미 있어야 합니다. 파티션 구성표를 만들려면 CREATE PARTITION SCHEME을 참조하세요.

column_name은 분할된 인덱스가 분할되는 기준으로 사용할 열을 지정합니다. 이 열은 partition_scheme_name에서 사용하는 파티션 함수의 인수와 데이터 형식, 길이 및 전체 자릿수가 일치해야 합니다.

filegroup_name은 클러스터형 columnstore 인덱스를 저장할 파일 그룹을 지정합니다. 지정된 위치가 없고 테이블이 분할되지 않은 경우 인덱스는 기본 테이블 또는 뷰와 동일한 파일 그룹을 사용합니다. 파일 그룹은 이미 존재해야 합니다.

기본 파일 그룹에서 인덱스 만들기, 사용 "default" 또는 [default]. 지정 "default"QUOTED_IDENTIFIER 하는 경우 현재 세션에 대한 옵션이어야 ON 합니다. QUOTED_IDENTIFIERON 기본적으로 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하세요.

CREATE [NONCLUSTERED] COLUMNSTORE INDEX

힙 또는 클러스터형 인덱스로 저장된 rowstore 테이블에 비클러스터형 columnstore 인덱스를 만듭니다. 인덱스는 필터링된 조건을 가질 수 있으며 기본 테이블의 모든 열을 포함할 필요가 없습니다. Columnstore 인덱스에 데이터 복사본을 저장할 충분한 공간이 필요합니다. 인덱스는 업데이트할 수 있으며 기본 테이블이 변경되면 업데이트됩니다. 클러스터형 인덱스에 대한 비 클러스터형 columnstore 인덱스는 실시간 분석이 가능합니다.

index_name

인덱스의 이름을 지정합니다. index_name은 테이블 내에서 고유해야 하지만 데이터베이스 내에서 고유할 필요는 없습니다. 인덱스 이름은 식별자 규칙을 따라야 합니다.

( column [ ,...n ] )

저장할 열을 지정합니다. 비클러스터형 columnstore 인덱스는 1,024열로 제한됩니다. 각 열은 columnstore 인덱스에 대해 지원되는 데이터 형식이어야 합니다. 지원되는 데이터 형식 목록은 제한 사항을 참조하세요.

ON [ database_name. [ schema_name ] . | schema_name . ] table_name

인덱스를 포함할 테이블의 1, 2 또는 3 부분 이름을 지정합니다.

WITH 옵션

DROP_EXISTING = [OFF] | ON

DROP_EXISTING = ON 기존 인덱스가 삭제되고 다시 작성됩니다. 지정된 인덱스 이름은 현재 존재하는 인덱스 이름과 같아야 합니다. 그러나 인덱스 정의는 수정할 수 있습니다. 예를 들어, 다른 열 또는 인덱스 옵션을 지정할 수 있습니다.

DROP_EXISTING = OFF
지정된 인덱스 이름이 이미 존재하는 경우 오류가 표시됩니다. 인덱스 유형은 DROP_EXISTING을 사용하여 변경할 수 없습니다. 이전 버전과 호환되는 구문에서 WITH DROP_EXISTING은 WITH DROP_EXISTING = ON과 같습니다.

MAXDOP = max_degree_of_parallelism

인덱스 작업 중에 최대 병렬 처리 수준 구성(서버 구성 옵션) 구성 옵션을 재정의합니다. MAXDOP를 사용하여 병렬 계획 실행에 사용되는 프로세서 수를 제한할 수 있습니다. 최대값은 64개입니다.

max_degree_of_parallelism 값은 다음 중 하나일 수 있습니다.

  • 1. 즉, 병렬 계획 생성을 억제합니다.
  • >1, 즉, 병렬 인덱스 작업에 사용되는 최대 프로세서 수를 현재 시스템 작업에 따라 지정된 수 또는 더 적은 수로 제한합니다. 예를 들어, MAXDOP = 4인 경우 사용되는 프로세서 수는 4개 이하가 됩니다.
  • 0(기본값), 즉, 현재 시스템 작업에 따라 실제 프로세서 수 이하의 프로세서를 사용합니다.

자세한 내용은 병렬 인덱스 작업 구성을 참조하세요.

참고

병렬 인덱스 작업은 일부 Microsoft SQL Server 버전에서 사용할 수 있습니다. SQL Server 버전에서 지원하는 기능 목록은 SQL Server 2022의 버전 및 지원되는 기능을 참조하세요.

ONLINE = [ON | OFF]
  • ON은 인덱스의 새 복사본을 만드는 동안 columnstore 인덱스가 온라인 상태를 유지하고 사용할 수 있도록 지정합니다.
  • OFF는 새 복사본을 만드는 동안 인덱스를 사용할 수 없도록 지정합니다. 비클러스터형 인덱스에서는 기본 테이블을 사용할 수 있습니다. 새 인덱스가 완료될 때까지 비클러스터형 columnstore 인덱스만 쿼리를 충족하는 데 사용되지 않습니다.
CREATE COLUMNSTORE INDEX ncci ON Sales.OrderLines (StockItemID, Quantity, UnitPrice, TaxRate)
WITH ( ONLINE = ON );
COMPRESSION_DELAY = 0 | delay [ MINUTES ]

압축된 rowgroup으로 마이그레이션할 수 있기 전에 행이 델타 rowgroup에 남아 있어야 하는 시간의 하한을 지정합니다. 예를 들어, 한 행이 120분 동안 변경되지 않은 경우 해당 행은 열 스토리지 형식으로 압축하기에 적합하다고 말할 수 있습니다.

디스크 기반 테이블의 columnstore 인덱스의 경우 행이 삽입되거나 업데이트된 시간은 추적되지 않습니다. 대신 델타 rowgroup 닫힘 시간이 행의 프록시로 사용됩니다. 기본 기간은 0분입니다. 델타 행 그룹에 100만 개의 행이 누적된 후 행이 열 형식 스토리지로 마이그레이션되고 닫힌 것으로 표시됩니다.

DATA_COMPRESSION

지정된 테이블, 파티션 번호 또는 파티션 범위에 대한 데이터 압축 옵션을 지정합니다. 비클러스터형 및 클러스터형 columnstore 인덱스에만 적용됩니다. 옵션은 다음과 같습니다.

  • COLUMNSTORE는 기본값이고 성능이 가장 우수한 columnstore 압축으로 압축하도록 지정합니다. 이 옵션은 일반적인 선택입니다.
  • COLUMNSTORE_ARCHIVE는 테이블 또는 파티션을 보다 작은 크기로 더욱 압축합니다. 이 옵션은 아카이브에 사용하거나 더 작은 스토리지 크기가 필요하고 저장 및 검색에 더 많은 시간을 할애할 수 있는 다른 상황에 사용할 수 있습니다.

압축에 대한 자세한 내용은 데이터 압축을 참조하세요.

WHERE <filter_expression> [ AND <filter_expression> ]

필터 조건자라고 부르는 이 옵션은 인덱스에 어떤 열을 포함할지 지정합니다. SQL Server 필터링된 인덱스의 데이터 행에 대한 필터링된 통계를 만듭니다.

필터 조건자는 간단한 비교 논리를 사용합니다. 리터럴을 사용하는 NULL 비교는 비교 연산자를 사용할 수 없습니다. 대신 IS NULLIS NOT NULL 연산자를 사용합니다.

다음은 Production.BillOfMaterials 테이블에 대한 필터 조건자의 몇 가지 예입니다.

  • WHERE StartDate > '20000101' AND EndDate <= '20000630'
  • WHERE ComponentID IN (533, 324, 753)
  • WHERE StartDate IN ('20000404', '20000905') AND EndDate IS NOT NULL

필터링된 인덱스에 대한 지침은 필터링된 인덱스 만들기를 참조하세요.

ON 옵션

다음 옵션은 인덱스를 만들 파일 그룹을 지정합니다.

partition_scheme_name ( column_name )

분할된 인덱스의 파티션이 매핑될 파일 그룹을 정의하는 파티션 구성표를 지정합니다. 파티션 구성표는 CREATE PARTITION SCHEME을 실행하여 데이터베이스 내에 포함해야 합니다.

column_name은 분할된 인덱스가 분할되는 기준으로 사용할 열을 지정합니다. 이 열은 partition_scheme_name에서 사용하는 파티션 함수의 인수와 데이터 형식, 길이 및 전체 자릿수가 일치해야 합니다. column_name은 인덱스 정의의 열만 사용할 필요는 없으며 columnstore 인덱스를 분할하는 경우 데이터베이스 엔진에서는 인덱스의 열이 아직 지정되지 않은 경우 분할 열을 인덱스의 열로 추가합니다.

테이블이 분할되어 있고 partition_scheme_name 또는 filegroup이 지정되지 않은 경우, 인덱스는 동일한 파티션 구성표에 배치되어 기본 테이블과 동일한 분할 열을 사용합니다.

분할된 테이블의 Columnstore 인덱스는 파티션 정렬됩니다. 분할된 인덱스에 대한 자세한 내용은 분할된 테이블 및 인덱스를 참조하세요.

filegroup_name

인덱스를 만들 파일 그룹 이름을 지정합니다. filegroup_name이 지정되지 않고 테이블이 분할되지 않은 경우 인덱스는 기본 테이블과 동일한 파일 그룹을 사용합니다. 파일 그룹은 이미 존재해야 합니다.

"default"

기본 파일 그룹에 지정된 인덱스를 만듭니다.

이 컨텍스트에서 default는 키워드가 아닙니다. 기본 파일 그룹에 대한 식별자이며 ON "default" 또는 ON [default]와 같이 구분되어야 합니다. "default"를 지정하면 현재 세션의 QUOTED_IDENTIFIER 옵션이 ON이어야 하며, 이것이 기본 설정입니다. 자세한 내용은 SET QUOTED_IDENTIFIER(Transact-SQL)를 참조하세요.

사용 권한

테이블에 대한 ALTER 사용 권한이 필요합니다.

설명

임시 테이블에 대한 columnstore 인덱스를 만들 수 있습니다. 테이블이 삭제되거나 세션이 종료되면 인덱스도 삭제됩니다.

필터링된 인덱스

필터링된 인덱스는 테이블에서 적은 비율의 행을 선택하는 쿼리에 적합한 최적화된 비클러스터형 인덱스입니다. 이 인덱스에서는 필터 조건자를 사용하여 테이블의 일부 데이터를 인덱싱합니다. 잘 디자인된 필터링된 인덱스는 쿼리 성능을 개선하고 스토리지 비용과 유지 관리 비용을 줄일 수 있습니다.

필터링된 인덱스에 필요한 SET 옵션

다음 조건이 발생할 때마다 필요한 값 열에 SET 옵션을 사용해야 합니다.

  • 필터링된 인덱스를 만듭니다.
  • INSERT, UPDATE, DELETE 또는 MERGE 작업으로 필터링된 인덱스의 데이터를 수정합니다.
  • 쿼리 최적화 프로그램이 필터링된 인덱스를 사용하여 쿼리 계획을 작성합니다.
Set 옵션 필수 값 기본 서버 값 기본 OLE DB 및 ODBC 값 기본 DB-Library 값
ANSI_NULLS 켜기 켜기 켜기 OFF
ANSI_PADDING 켜기 켜기 켜기 OFF
ANSI_WARNINGS 1 켜기 켜기 켜기 OFF
ARITHABORT 켜기 켜기 OFF OFF
CONCAT_NULL_YIELDS_NULL 켜기 켜기 켜기 OFF
NUMERIC_ROUNDABORT OFF OFF OFF OFF
QUOTED_IDENTIFIER 켜기 켜기 켜기 OFF

1데이터베이스 호환성 수준이 90 이상으로 설정된 경우 ANSI_WARNINGS를 ON으로 설정하면 암시적으로 ARITHABORT가 ON으로 설정됩니다. 데이터베이스 호환성 수준을 80 이하로 설정한 경우 명시적으로 ARITHABORT 옵션을 ON으로 설정해야 합니다.

SET 옵션이 올바르지 않은 경우 다음 조건이 발생할 수 있습니다.

  • 필터링된 인덱스가 만들어지지 않습니다.

  • 데이터베이스 엔진에서 오류를 생성하고 인덱스의 데이터를 변경하는 INSERT, UPDATE, DELETE 또는 MERGE 문을 롤백합니다.

  • 쿼리 최적화 프로그램에서 Transact-SQL 문의 실행 계획에 있는 인덱스를 고려하지 않습니다.

필터링된 인덱스에 대한 자세한 내용은 필터링된 인덱스 만들기를 참조하세요.

제한 사항

columnstore 인덱스의 각 열은 다음 일반적인 비즈니스 데이터 형식 중 하나여야 합니다.

  • datetimeoffset [ ( n ) ]
  • datetime2 [ ( n ) ]
  • datetime
  • smalldatetime
  • date
  • time [ ( n ) ]
  • float [ ( n ) ]
  • real [ ( n ) ]
  • decimal [ ( precision [ , scale ] ) ]
  • numeric [ ( precision [ , scale ] ) ]
  • money
  • smallmoney
  • bigint
  • int
  • smallint
  • tinyint
  • bit
  • nvarchar [ ( n ) ]
  • nvarchar(max)1
  • nchar [ ( n ) ]
  • varchar [ ( n ) ]
  • varchar(max)1
  • char [ ( n ) ]
  • varbinary [ ( n ) ]
  • varbinary(max)1
  • binary [ ( n ) ]
  • uniqueidentifier2

1 클러스터형 columnstore 인덱스에서만 SQL Server 2017(14.x) 및 프리미엄 계층, 표준 계층[S3 이상]에서 Azure SQL Database 및 모든 vCore 제품 계층에 적용됩니다.

2 SQL Server 2014(12.x) 이상 버전에 적용됩니다.

기본 테이블에 columnstore 인덱스에 대해 지원되지 않는 데이터 형식의 열이 있는 경우 비클러스터형 columnstore 인덱스에서 해당 열을 빼야 합니다.

8킬로바이트보다 큰 LOB(Large Object) 데이터는 열 세그먼트 내에 저장된 실제 위치에 대한 포인터만 사용하여 행 외 LOB 스토리지에 저장됩니다. 저장된 데이터의 크기는 sys.column_store_segments, sys.column_store_dictionaries, 또는 sys.dm_db_column_store_row_group_physical_stats에 보고되지 않습니다.

다음 데이터 형식을 사용하는 열은 columnstore 인덱스에 포함할 수 없습니다.

  • ntext, text, image
  • nvarchar(max), varchar(max), varbinary(max)1
  • rowversion(및 timestamp)
  • sql_variant
  • CLR 형식(hierarchyid 및 공간 형식)
  • xml
  • uniqueidentifier2

1 SQL Server 2016(13.x) 포함 이전 버전 및 비클러스터형 columnstore 인덱스에 적용됩니다.

2 SQL Server 2012(11.x)에 적용됩니다.

비클러스터형 columnstore 인덱스:

  • 열이 1,024개 이상 있을 수 없습니다.
  • 제약 조건 기반 인덱스로 만들 수 없습니다. columnstore 인덱스가 있는 테이블에 고유한 제약 조건, 기본 키 제약 조건 또는 외래 키 제약 조건을 가질 수 없습니다. 제약 조건은 항상 행 저장소 인덱스에서 적용됩니다. 제약 조건은 columnstore(클러스터형 또는 비클러스터형) 인덱스에서 적용될 수 없습니다.
  • 스파스 열을 포함할 수 없습니다.
  • ALTER INDEX 문을 사용하여 변경할 수 없습니다. 비클러스터형 인덱스를 변경하려면 인덱스를 삭제하고 해당 columnstore 인덱스를 대신 다시 만들어야 합니다. ALTER INDEX를 사용하여 columnstore 인덱스를 해제하고 다시 만들 수 있습니다.
  • INCLUDE 키워드를 사용하여 만들 수 없습니다.
  • 인덱스를 정렬하기 위해 ASC 또는 DESC 키워드를 포함할 수 없습니다. columnstore 인덱스는 압축 알고리즘에 따라 정렬됩니다. 정렬을 사용하면 성능상의 많은 이점이 없어집니다. Azure Synapse Analytics에서 SQL Server 2022(16.x)부터 columnstore 인덱스의 열에 대한 순서를 지정할 수 있습니다. 자세한 내용은 순서가 지정된 클러스터형 columnstore 인덱스를 참조하세요.
  • 비클러스터형 columnstore 인덱스에 nvarchar(max), varchar(max)varbinary(max) 형식의 LOB 열을 포함할 수 없습니다. 클러스터형 columnstore 인덱스만 SQL Server 2017(14.x) 버전, Azure SQL Database(프리미엄 계층, 표준 계층(S3 이상) 및 모든 vCore 제품 계층에서 구성된 LOB 형식을 지원합니다. 이전 버전은 클러스터형 및 비클러스터형 columnstore 인덱스의 LOB 형식을 지원하지 않습니다.
  • SQL Server 2016(13.x)부터 인덱싱 된 뷰에서 비클러스터형 columnstore 인덱스를 만들 수 있습니다.

columnstore 인덱스는 다음 기능과 함께 사용할 수 없습니다.

  • 계산된 열입니다. SQL Server 2017(14.x)부터 클러스터형 columnstore 인덱스가 비지속형 계산 열을 포함할 수 있습니다. 그러나 SQL Server 2017(14.x)에서 클러스터형 columnstore 인덱스는 지속형 계산 열을 포함할 수 없으며 계산 열에 비클러스터형 인덱스를 만들 수 없습니다.
  • 페이지 및 행 압축 및 vardecimal 스토리지 형식입니다. (columnstore 인덱스가 이미 다른 형식으로 압축되어 있음.)
  • 복제.
  • Filestream.

클러스터형 columnstore 인덱스가 있는 테이블에서는 커서 또는 트리거를 사용할 수 없습니다. 이 제한은 비클러스터형 columnstore 인덱스에는 적용되지 않습니다. 비클러스터형 columnstore 인덱스가 있는 테이블에서는 커서 또는 트리거를 사용할 수 있습니다.

SQL Server 2014(12.x) 특정 제한 사항:

다음 제한 사항은 SQL Server 2014(12.x)에만 적용됩니다. 이 릴리스에서는 업데이트 가능한 클러스터형 columnstore 인덱스를 사용할 수 있습니다. 비클러스터형 columnstore 인덱스는 여전히 읽기 전용입니다.

  • 변경 내용 추적 columnstore 인덱스에는 변경 내용 추적을 사용할 수 없습니다.
  • 변경 데이터 캡처 클러스터형 columnstore 인덱스가 있는 테이블에서는 이 기능을 사용하도록 설정할 수 없습니다. SQL Server 2016(13.x)부터 비클러스터형 columnstore 인덱스가 있는 테이블에서 변경 데이터 캡처를 사용할 수 있습니다.
  • 읽기용 보조 Always OnReadable 가용성 그룹의 읽기 가능한 보조에서 CCI(클러스터형 columnstore 인덱스)에 액세스할 수 없습니다. 읽기 가능한 보조에서 NCCI(비클러스터형 columnstore 인덱스)에 액세스할 수 있습니다.
  • MARS(Multiple Active Result Sets) SQL Server 2014(12.x)는 이 기능을 사용하여 columnstore 인덱스가 있는 테이블에 대한 읽기 전용 연결을 합니다. 그러나 SQL Server 2014(12.x)는 columnstore 인덱스가 있는 테이블에서 동시 DML(데이터 조작 언어) 작업에는 이 기능을 지원하지 않습니다. 이 기능을 이 용도로 사용하려고 하면 SQL Server가 연결을 종료하고 트랜잭션을 취소합니다.
  • 비클러스터형 columnstore 인덱스는 뷰 또는 인덱싱된 뷰에서 만들 수 없습니다.

columnstore 인덱스의 성능 이점 및 제한 사항에 대한 자세한 내용은 Columnstore 인덱스: 개요를 참조하세요.

메타데이터

columnstore 인덱스에 있는 모든 열이 메타데이터에 포괄 열로 저장됩니다. columnstore 인덱스에는 키 열이 없습니다. 다음 시스템 뷰는 columnstore 인덱스에 대한 정보를 제공합니다.

예: 테이블을 rowstore에서 columnstore로 변환

A. 클러스터형 columnstore 인덱스로 힙 변환

이 예에서는 테이블을 힙으로 만들고 이를 cci_Simple(이)라는 클러스터형 columnstore 인덱스로 변환합니다. 클러스터형 columnstore 인덱스가 생성되면 전체 테이블의 스토리지가 rowstore에서 columnstore로 변경됩니다.

CREATE TABLE dbo.SimpleTable(
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cci_Simple ON dbo.SimpleTable;
GO

B. 클러스터형 인덱스를 동일한 이름의 클러스터형 columnstore 인덱스로 변환

이 예에서는 클러스터형 인덱스가 있는 테이블을 만든 후 클러스터형 인덱스를 클러스터형 columnstore 인덱스로 변환하는 구문을 보여 줍니다. 클러스터형 columnstore 인덱스가 생성되면 전체 테이블의 스토리지가 rowstore에서 columnstore로 변경됩니다.

CREATE TABLE dbo.SimpleTable2 (
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO
CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable2 (ProductKey);
GO
CREATE CLUSTERED COLUMNSTORE INDEX cl_simple ON dbo.SimpleTable2
WITH (DROP_EXISTING = ON);
GO

C. rowstore 테이블을 columnstore 인덱스로 변환할 때 비클러스터형 인덱스 처리

이 예에서는 rowstore 테이블을 columnstore 인덱스로 변환할 때 비클러스터형 인덱스를 처리하는 방법을 보여줍니다. SQL Server 2016(13.x)부터는 특별한 작업이 필요하지 않습니다. SQL Server는 새로운 클러스터형 columnstore 인덱스에서 비클러스터형 인덱스를 자동으로 정의하고 다시 작성합니다.

비클러스터형 인덱스를 삭제하려면 columnstore 인덱스를 만들기 전에 DROP INDEX 문을 사용합니다. DROP EXISTING 옵션은 변환중인 클러스터형 인덱스만 삭제합니다. 비클러스터형 인덱스는 삭제하지 않습니다.

SQL Server 2012(11.x) 및 SQL Server 2014(12.x)에서 columnstore 인덱스에 비클러스터형 인덱스를 만들 수 없습니다.

--Create the table for use with this example.
CREATE TABLE dbo.SimpleTable (
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO
  
--Create two nonclustered indexes for use with this example
CREATE INDEX nc1_simple ON dbo.SimpleTable (OrderDateKey);
CREATE INDEX nc2_simple ON dbo.SimpleTable (DueDateKey);
GO

SQL Server 2012(11.x) 및 SQL Server 2014(12.x)에 대해서만 columnstore 인덱스를 만들려면 비클러스터형 인덱스를 삭제해야 합니다.

DROP INDEX dbo.SimpleTable.nc1_simple;
DROP INDEX dbo.SimpleTable.nc2_simple;
  
--Convert the rowstore table to a columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_simple ON dbo.SimpleTable;
GO

D. rowstore에서 columnstore로 큰 팩트 테이블 변환

이 예에서는 큰 팩트 테이블을 rowstore 테이블에서 columnstore 테이블로 변환하는 방법을 설명합니다.

  1. 이 예에서 사용할 작은 테이블을 만듭니다.

    --Create a rowstore table with a clustered index and a nonclustered index.
    CREATE TABLE dbo.MyFactTable (
        ProductKey [INT] NOT NULL,
        OrderDateKey [INT] NOT NULL,
        DueDateKey [INT] NOT NULL,
        ShipDateKey [INT] NOT NULL
    INDEX IDX_CL_MyFactTable CLUSTERED  ( ProductKey )
    );
    
    --Add a nonclustered index.
    CREATE INDEX my_index ON dbo.MyFactTable ( ProductKey, OrderDateKey );
    
  2. rowstore 테이블에서 모든 비클러스터형 인덱스를 삭제합니다. 나중에 인덱스를 스크립트로 다시 만드는 것이 좋습니다.

    --Drop all nonclustered indexes
    DROP INDEX my_index ON dbo.MyFactTable;
    
  3. rowstore 테이블을 클러스터형 columnstore 인덱스가 있는 columnstore 테이블로 변환합니다.

    먼저 기존 클러스터형 rowstore 인덱스의 이름을 조회합니다. 1단계에서는 인덱스의 이름을 IDX_CL_MyFactTable로 설정합니다. 인덱스 이름을 지정하지 않았으면 자동 생성된 고유 인덱스 이름이 지정됐습니다. 다음 샘플 쿼리를 사용하여 자동으로 생성된 이름을 검색할 수 있습니다.

    SELECT i.object_id, i.name, t.object_id, t.name
    FROM sys.indexes i
    INNER JOIN sys.tables t ON i.object_id = t.object_id
    WHERE i.type_desc = 'CLUSTERED'
    AND t.name = 'MyFactTable';
    

    옵션 1: 기존 클러스터형 인덱스 IDX_CL_MyFactTable을 삭제하고 MyFactTable을 columnstore로 변환합니다. 새 클러스터형 Columnstore 인덱스의 이름을 바꿉니다.

    --Drop the clustered rowstore index.
    DROP INDEX [IDX_CL_MyFactTable]
    ON dbo.MyFactTable;
    GO
    --Create a new clustered columnstore index with the name MyCCI.
    CREATE CLUSTERED COLUMNSTORE
    INDEX IDX_CCL_MyFactTable ON dbo.MyFactTable;
    GO
    

    옵션 2: columnstore로 변환하고 기존 rowstore 클러스터형 인덱스 이름을 다시 사용합니다.

    --Create the clustered columnstore index,
    --replacing the existing rowstore clustered index of the same name
    CREATE CLUSTERED COLUMNSTORE
    INDEX [IDX_CL_MyFactTable]
    ON dbo.MyFactTable
    WITH (DROP_EXISTING = ON);
    

E. columnstore 테이블을 클러스터형 인덱스가 있는 rowstore 테이블로 변환

columnstore 테이블을 클러스터형 인덱스가 있는 rowstore 테이블로 변환하려면 CREATE INDEX 문을 DROP_EXISTING 옵션과 함께 사용합니다.

CREATE CLUSTERED INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable] ( ProductKey )
WITH ( DROP_EXISTING = ON );

F. columnstore 테이블을 rowstore 힙으로 변환

columnstore 테이블을 rowstore 힙으로 변환하려면 간단히 클러스터형 columnstore 인덱스를 삭제하면 됩니다. 일반적으로 권장되지는 않지만 용도가 좁을 수도 있습니다. 힙에 대한 자세한 내용은 힙(클러스터형 인덱스가 없는 테이블)을 참조하세요.

DROP INDEX [IDX_CL_MyFactTable]
ON dbo.[MyFactTable];

G. columnstore 인덱스를 다시 구성하여 조각 모음

두 가지 방법으로 전체 클러스터형 columnstore 인덱스를 유지할 수 있습니다. SQL Server 2016(13.x)부터는 REBUILD 대신 ALTER INDEX...REORGANIZE을(를) 사용합니다. 자세한 내용은 Columnstore 인덱스 rowgroup을 참조하세요. 이전 버전의 SQL Server DROP_EXISTING=ON 또는 ALTER INDEX(Transact-SQL) 및 REBUILD 옵션을 사용하여 CREATE CLUSTERED COLUMNSTORE INDEX를 사용할 수 있습니다. 두 방법 모두 동일한 결과를 얻을 수 있습니다.

먼저 MyFactTable에서 클러스터형 columnstore 인덱스 이름을 확인합니다.

SELECT i.object_id, i.name, t.object_id, t.name
FROM sys.indexes i
INNER JOIN sys.tables t on i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED COLUMNSTORE'
AND t.name = 'MyFactTable';

columnstore 인덱스에서 REORGANIZE를 수행하여 조각화를 제거합니다.

--Rebuild the entire index by using ALTER INDEX and the REBUILD option.
ALTER INDEX IDX_CL_MyFactTable
ON dbo.[MyFactTable]
REORGANIZE;

비클러스터형 columnstore 인덱스 사용

A. Rowstore 테이블에서 columnstore 인덱스를 보조 인덱스로 만들기

이 예에서는 rowstore 테이블에 비클러스터형 columnstore 인덱스를 만듭니다. 이 경우 columnstore 인덱스는 하나만 만들 수 있습니다. Columnstore 인덱스는 rowstore 테이블에 데이터 복사본을 포함하고 있으므로 추가 스토리지가 필요합니다. 이 예에서는 간단한 테이블 및 rowstore 클러스터형 인덱스를 만든 다음, 비클러스터형 columnstore 인덱스를 만드는 구문을 보여 줍니다.

CREATE TABLE dbo.SimpleTable (
    ProductKey [INT] NOT NULL,
    OrderDateKey [INT] NOT NULL,
    DueDateKey [INT] NOT NULL,
    ShipDateKey [INT] NOT NULL);
GO

CREATE CLUSTERED INDEX cl_simple ON dbo.SimpleTable (ProductKey);
GO

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON dbo.SimpleTable (OrderDateKey, DueDateKey, ShipDateKey);
GO

B. 모든 옵션을 사용하여 기본 비클러스터형 columnstore 인덱스 만들기

다음 예제에서는 DEFAULT 파일 그룹에 비클러스터형 columnstore 인덱스를 만들고 MAXDOP(최대 병렬 처리 수준)를 2로 지정하는 구문을 보여 줍니다.

CREATE NONCLUSTERED COLUMNSTORE INDEX csindx_simple
ON SimpleTable (OrderDateKey, DueDateKey, ShipDateKey)
WITH (DROP_EXISTING =  ON,
    MAXDOP = 2)
ON "DEFAULT";
GO

C. 필터링된 조건자를 사용하여 비클러스터형 columnstore 인덱스 만들기

다음 예에서는 AdventureWorks2022 샘플 데이터베이스의 Production.BillOfMaterials 테이블에 필터링된 비클러스터형 columnstore 인덱스를 만듭니다. 필터 조건자는 필터링된 인덱스에 키 열이 아닌 열을 포함할 수 있습니다. 이 예에서 조건자는 EndDate이(가) NULL이 아닌 행만 선택합니다.

IF EXISTS (SELECT name FROM sys.indexes
    WHERE name = N'FIBillOfMaterialsWithEndDate'
    AND object_id = OBJECT_ID(N'Production.BillOfMaterials'))
DROP INDEX FIBillOfMaterialsWithEndDate
    ON Production.BillOfMaterials;
GO
CREATE NONCLUSTERED COLUMNSTORE INDEX "FIBillOfMaterialsWithEndDate"
    ON Production.BillOfMaterials (ComponentID, StartDate)
    WHERE EndDate IS NOT NULL;

D. 비클러스터형 Columnstore 인덱스의 데이터 변경

적용 대상: SQL Server 2012(11.x) 부터 SQL Server 2014(12.x)까지

SQL Server 2014(12.x) 및 이전 버전에서는 테이블에 비클러스터형 columnstore 인덱스가 만들어지면 해당 테이블의 데이터를 직접 수정할 수 없습니다. INSERT, UPDATE, DELETE 또는 MERGE를 사용한 쿼리는 실패하며 오류 메시지를 반환합니다. 다음은 테이블에서 데이터를 추가하거나 수정하는 데 사용할 수 있는 옵션입니다.

  • columnstore 인덱스를 사용하지 않도록 설정하거나 삭제합니다. 그런 다음 테이블에서 데이터를 업데이트할 수 있습니다. columnstore 인덱스를 사용하지 않도록 설정하는 경우 데이터 업데이트를 완료할 때 columnstore 인덱스를 다시 작성할 수 있습니다. 다음은 그 예입니다.

    ALTER INDEX mycolumnstoreindex ON dbo.mytable DISABLE;
    -- update the data in mytable as necessary
    ALTER INDEX mycolumnstoreindex on dbo.mytable REBUILD;
    
  • columnstore 인덱스가 없는 준비 테이블에 데이터를 로드합니다. 준비 테이블에서 columnstore 인덱스를 작성합니다. 준비 테이블을 주 테이블의 빈 파티션으로 전환합니다.

  • columnstore 인덱스가 있는 테이블에서 빈 준비 테이블로 파티션을 전환합니다. 준비 테이블에 columnstore 인덱스가 있는 경우 columnstore 인덱스를 사용하지 않도록 설정합니다. 업데이트를 수행합니다. columnstore 인덱스를 작성 또는 다시 작성합니다. 준비 테이블을 주 테이블의 파티션(현재 비어 있음)으로 다시 전환합니다.

예제: Azure Synapse Analytics, 분석 플랫폼 시스템(PDW)

A. 클러스터형 인덱스를 클러스터형 columnstore 인덱스로 변환합니다.

DROP_EXISTING = ON과 함께 CREATE CLUSTERED COLUMNSTORE INDEX 문을 사용하면 다음을 수행할 수 있습니다.

  • 클러스터형 인덱스를 클러스터형 columnstore 인덱스로 변환합니다.

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

이 예에서는 클러스터형 인덱스가 있는 rowstore 테이블로xDimProduct 테이블을 만듭니다. 그런 다음 이 예에서는 CREATE CLUSTED CARMONSTORE INDEX를 사용하여 테이블을 rowstore 테이블에서 columnstore 테이블로 변경합니다.

-- Uses AdventureWorks
  
IF EXISTS (SELECT name FROM sys.tables
    WHERE name = N'xDimProduct'
    AND object_id = OBJECT_ID (N'xDimProduct'))
DROP TABLE xDimProduct;
  
--Create a distributed table with a clustered index.
CREATE TABLE xDimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey)
WITH ( DISTRIBUTION = HASH(ProductKey),
    CLUSTERED INDEX (ProductKey) )
AS SELECT ProductKey, ProductAlternateKey, ProductSubcategoryKey FROM DimProduct;

sys.indexes를 사용하여 시스템 메타데이터의 새 테이블에 대해 자동으로 생성된 클러스터형 인덱스의 이름을 조회합니다. 다음은 그 예입니다.

SELECT i.object_id, i.name, t.object_id, t.name, i.type_desc
FROM sys.indexes i
INNER JOIN sys.tables t ON i.object_id = t.object_id
WHERE i.type_desc = 'CLUSTERED'
AND t.name = 'xdimProduct';

이제 다음과 같은 옵션을 선택할 수 있습니다.

  1. 자동으로 생성된 이름의 기존 클러스터형 columnstore 인덱스를 삭제한 다음 사용자 정의 이름으로 새 클러스터형 columnstore 인덱스를 만듭니다.
  2. 기존 인덱스 삭제 후 클러스터형 columnstore 인덱스로 바꿔 시스템 생성 이름과 같은 이름(예: ClusteredIndex_1bd8af8797f7453182903cc68df48541)을 유지합니다.

예를 들면 다음과 같습니다.

--1. DROP the existing clustered columnstore index with an automatically-created name, for example:
DROP INDEX ClusteredIndex_1bd8af8797f7453182903cc68df48541 on xdimProduct;
GO
CREATE CLUSTERED COLUMNSTORE INDEX [<new_index_name>]
ON xdimProduct;
GO

--Or,
--2. Change the existing clustered index to a clustered columnstore index with the same name.
CREATE CLUSTERED COLUMNSTORE INDEX [ClusteredIndex_1bd8af8797f7453182903cc68df48541]
ON xdimProduct
WITH ( DROP_EXISTING = ON );
GO

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

앞의 예를 기반으로 이 예에서는 CREATE CLUSTERED COLUMNSTORE INDEX를 사용하여 cci_xDimProduct라는 기존 클러스터형 columnstore 인덱스를 다시 작성합니다.

--Rebuild the existing clustered columnstore index.
CREATE CLUSTERED COLUMNSTORE INDEX cci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = ON );

C. 클러스터형 Columnstore 인덱스의 이름 바꾸기

클러스터형 columnstore 인덱스의 이름을 변경하려면 기존 클러스터형 columnstore 인덱스를 삭제한 다음, 새 이름으로 인덱스를 다시 만듭니다.

이 작업은 작은 테이블이나 빈 테이블로 제한하는 것이 좋습니다. 대규모 클러스터형 columnstore 인덱스를 삭제하고 다른 이름으로 다시 작성하려면 시간이 오래 걸립니다.

이 예에서는 이전 예제의 cci_xDimProduct 클러스터형 columnstore 인덱스를 참조합니다. 이 예에서는 cci_xDimProduct 클러스터형 columnstore 인덱스를 삭제한 다음 mycci_xDimProduct 이름으로 클러스터형 columnstore 인덱스를 다시 만듭니다.

--For illustration purposes, drop the clustered columnstore index.
--The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xDimProduct;
  
--Create a clustered index with a new name, mycci_xDimProduct.
CREATE CLUSTERED COLUMNSTORE INDEX mycci_xDimProduct
ON xdimProduct
WITH ( DROP_EXISTING = OFF );

D. columnstore 테이블을 클러스터형 인덱스가 있는 rowstore 테이블로 변환

클러스터형 columnstore 인덱스를 삭제하고 클러스터형 인덱스를 만들고자 하는 상황이 있을 수도 있습니다. 클러스터형 columnstore 인덱스가 삭제되면 테이블이 rowstore 형식으로 변경됩니다. 이 예에서는 columnstore 테이블을 클러스터형 인덱스가 있는 같은 이름의 rowstore 테이블로 변환합니다. 데이터가 손실되지 않습니다. 모든 데이터는 rowstore 테이블로 이동하고 나열된 열은 클러스터형 인덱스의 키 열이 됩니다.

--Drop the clustered columnstore index and create a clustered rowstore index.
--All of the columns are stored in the rowstore clustered index.
--The columns listed are the included columns in the index.
CREATE CLUSTERED INDEX cci_xDimProduct
ON xdimProduct (ProductKey, ProductAlternateKey, ProductSubcategoryKey, WeightUnitMeasureCode)
WITH ( DROP_EXISTING = ON);

E. columnstore 테이블을 rowstore 힙으로 변환

클러스터형 columnstore 인덱스를 삭제하고 테이블을 rowstore 힙으로 변환하려면 DROP INDEX(SQL Server PDW)를 사용합니다. 이 예에서는 cci_xDimProduct 테이블을 rowstore 힙으로 변환합니다. 테이블은 계속 배포되지만 힙으로 저장됩니다.

--Drop the clustered columnstore index. The table continues to be distributed, but changes to a heap.
DROP INDEX cci_xdimProduct ON xdimProduct;

F. 인덱스가 없는 테이블에 순서가 지정된 클러스터형 columnstore 인덱스 만들기

순서가 지정되지 않은 columnstore 인덱스는 기본적으로 열 목록을 지정할 필요 없이 모든 열을 포함합니다. 정렬된 columnstore 인덱스를 사용하면 열의 순서를 지정할 수 있습니다. 목록에 모든 열을 포함할 필요는 없습니다.

순서가 지정된 columnstore 인덱스는 Azure Synapse Analytics, PDW(Analytics Platform System) 및 SQL Server 2022(16.x)에서 사용할 수 있습니다. 자세한 내용은 순서가 지정된 클러스터형 columnstore 인덱스를 사용하여 성능 조정을 참조하세요.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE);

G. 클러스터형 columnstore 인덱스를 순서가 지정된 클러스터형 columnstore 인덱스로 변환

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE)
WITH (DROP_EXISTING = ON);

H. 순서가 지정된 클러스터형 columnstore 인덱스의 순서에 열 추가

Azure Synapse Analytics, 분석 플랫폼 시스템(PDW)에서 그리고 SQL Server 2022(16.x)부터는 columnstore 인덱스의 열 순서를 지정할 수 있습니다. 원래 정렬된 클러스터형 columnstore 인덱스가 SHIPDATE 열에만 정렬되었습니다. 다음 예제에서는 순서 지정에 PRODUCTKEY 열을 추가합니다.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (SHIPDATE, PRODUCTKEY)
WITH (DROP_EXISTING = ON);

9\. 정렬된 열의 서수 변경

정렬된 원본 클러스터형 columnstore 인덱스는 SHIPDATE, PRODUCTKEY에 정렬되었습니다. 다음 예제에서는 순서를 PRODUCTKEY, SHIPDATE(으)로 변경합니다.

CREATE CLUSTERED COLUMNSTORE INDEX cci ON Sales.OrderLines
ORDER (PRODUCTKEY,SHIPDATE)
WITH (DROP_EXISTING = ON);

J. 순서가 지정된 클러스터형 columnstore 인덱스 만들기

적용 대상: Azure Synapse Analytics 및 SQL Server 2022(16.x)

순서 지정 키를 사용하여 클러스터형 columnstore 인덱스를 만들 수 있습니다. 정렬된 클러스터형 columnstore 인덱스 만들기 시 최대 정렬 품질 및 가장 짧은 기간에 대한 쿼리 힌트 MAXDOP = 1 를 적용해야 합니다.

CREATE CLUSTERED COLUMNSTORE INDEX [OrderedCCI] ON dbo.FactResellerSalesPartCategoryFull
ORDER (EnglishProductSubcategoryName, EnglishProductName)
WITH (MAXDOP = 1, DROP_EXISTING = ON);