다음을 통해 공유


Columnstore Indexes Described

SQL Server 메모리 내 columnstore는 열 기반 데이터 스토리지 및 열 기반 쿼리 처리를 사용하여 데이터를 저장하고 관리합니다. columnstore 인덱스는 주로 대량 로드 및 읽기 전용 쿼리를 수행하는 데이터 웨어하우징 작업에 효과적입니다. columnstore 인덱스를 사용하면 기존의 행 기반 스토리지보다 최대 10배의 쿼리 성능 이익과 압축되지 않은 데이터 크기보다 최대 7배의 데이터 압축 을 얻을 수 있습니다.

참고

클러스터형 columnstore 인덱스를 대형 데이터 웨어하우징 팩트 테이블을 저장하기 위한 표준으로 보고 대부분의 데이터 웨어하우징 시나리오에 사용될 것으로 예상합니다. 클러스터형 columnstore 인덱스는 업데이트 가능하므로 해당 작업에서 많은 삽입, 업데이트 및 삭제 작업을 수행할 수 있습니다.

콘텐츠

기본 사항

columnstore index 는 columnstore라는 칼럼 데이터 형식을 사용하여 데이터를 저장, 검색 및 관리하는 기술입니다. SQL Server 클러스터형 및 비클러스터형 columnstore 인덱스를 모두 지원합니다. 둘 다 동일한 메모리 내 columnstore 기술을 사용하지만 용도와 지원 기능에 차이가 있습니다.

이점

columnstore 인덱스는 대개 큰 데이터 집합을 분석하는 읽기 전용 쿼리에 적합합니다. 주로 데이터 웨어하우징 작업에 대한 쿼리가 여기에 해당합니다. columnstore 인덱스는 전체 테이블 검색을 사용하는 쿼리에는 뛰어난 성능을 제공하지만 특정 값을 찾아 데이터를 검색하는 쿼리에는 부적합합니다.

columnstore 인덱스의 이점:

  • 열에는 비슷한 데이터가 있기 때문에 높은 압축 비율을 나타냅니다.

  • 압축 비율이 높으면 메모리 내 사용 공간이 감소되어 쿼리 성능이 향상됩니다. 따라서 SQL Server 메모리 내 더 많은 쿼리 및 데이터 작업을 수행할 수 있으므로 쿼리 성능이 향상될 수 있습니다.

  • 배치 모드 실행이라는 새로운 쿼리 실행 메커니즘이 SQL Server에 추가되어 CPU 사용량을 크게 줄입니다. 배치 모드 실행은 columnstore 스토리지 형식과 긴밀히 통합되고 그에 맞게 최적화되어 있습니다. 배치 모드 실행을 벡터 기반 또는 벡터화된 실행이라고도 합니다.

  • 쿼리는 대개 테이블에서 적은 수의 열만 선택하므로 실제 미디어의 총 I/O가 감소됩니다.

columnstore 버전

SQL Server 2012, SQL Server 2012 Parallel Data Warehouse 및 SQL Server 2014 모두 columnstore 인덱스를 사용하여 일반적인 데이터 웨어하우스 쿼리 속도를 높입니다. SQL Server 2012에는 비클러스터형 columnstore 인덱스와 "일괄 처리"라는 단위로 데이터를 처리하는 벡터 기반 쿼리 실행 기능이라는 두 가지 새로운 기능이 도입되었습니다. SQL Server 2014에는 SQL Server 2012의 기능과 업데이트 가능한 클러스터형 columnstore 인덱스가 있습니다.

주요 특징

적용 대상: SQL Server 2014~SQL Server 2019(15.x).

SQL Server 클러스터형 columnstore 인덱스:

  • Enterprise, Developer 및 Evaluation 버전으로 사용할 수 있습니다.

  • 업데이트할 수 있습니다.

  • 전체 테이블의 주 스토리지 방법입니다.

  • 키 열이 없습니다. 모든 열이 포괄 열입니다.

  • 테이블에 있는 유일한 인덱스입니다. 다른 인덱스와 함께 사용할 수 없습니다.

  • columnstore 또는 columnstore 보관 압축을 사용하도록 구성할 수 있습니다.

  • 열을 정렬 순서에 따라 물리적으로 저장하지 않습니다. 그 대신 압축과 성능을 개선할 수 있는 방법으로 데이터를 저장합니다.

적용 대상: SQL Server 2012~SQL Server 2019(15.x).

SQL Server 비클러스터형 columnstore 인덱스:

  • 열의 하위 집합을 클러스터형 인덱스 또는 힙으로 인덱싱할 수 있습니다. 예를 들어, 자주 사용하는 열을 인덱싱할 수 있습니다.

  • 인덱스의 열 복사본을 저장할 추가 스토리지가 필요합니다.

  • 인덱스를 다시 빌드하거나 파티션을 내부 및 외부로 전환하여 업데이트됩니다. 삽입, 업데이트 및 삭제와 같은 DML 작업을 사용하여 업데이트할 수 없습니다.

  • 테이블의 다른 인덱스와 결합할 수 있습니다.

  • columnstore 또는 columnstore 보관 압축을 사용하도록 구성할 수 있습니다.

  • 열을 정렬 순서에 따라 물리적으로 저장하지 않습니다. 그 대신 압축과 성능을 개선할 수 있는 방법으로 데이터를 저장합니다. columnstore 인덱스 작성 전 데이터 사전 정렬은 필수는 아니지만 columnstore 압축을 향상시킵니다.

주요 개념 및 용어

다음은 columnstore 인덱스와 관련된 주요 용어와 개념입니다.

columnstore 인덱스 columnstore 인덱스는 columnstore 라는 열 형식 데이터 형식을 사용하여 데이터를 저장, 검색 및 관리하는 기술입니다. SQL Server 클러스터형 및 비클러스터형 columnstore 인덱스를 모두 지원합니다. 둘 다 동일한 메모리 내 columnstore 기술을 사용하지만 용도와 지원 기능에 차이가 있습니다.

columnstore A columnstore 는 행과 열이 있는 테이블로 논리적으로 구성되고 실제로 열 단위 데이터 형식으로 저장된 데이터입니다.

rowstore Rowstore 는 행과 열이 있는 테이블로 논리적으로 구성된 다음 행 단위 데이터 형식으로 물리적으로 저장되는 데이터입니다. 이 방식은 관계형 테이블 데이터를 저장하는 전통적인 방법이었습니다.

rowgroups 및 열 세그먼트 고성능 및 높은 압축 속도를 위해 columnstore 인덱스는 테이블을 행 그룹이라고 하는 행 그룹으로 분할한 다음 각 행 그룹을 열 단위로 압축합니다. 행 그룹의 행 수는 압축률을 높일 만큼 크고, 메모리 내 작업을 활용할 만큼 작아야 합니다.

행 그룹 행 그룹은 동시에 columnstore 형식으로 압축되는 행 그룹입니다.

열 세그먼트 열 세그먼트 는 행 그룹 내의 데이터 열입니다.

  • 열 그룹에는 대개 1,048,576개(행 그룹당 최대 행 수)의 행이 포함됩니다.

  • 각 행 그룹에는 테이블의 모든 열에 대해 각각 하나의 열 세그먼트가 포함됩니다.

  • 각 열 세그먼트는 함께 압축되며 실제 미디어에 저장됩니다.

열 세그먼트

비클러스터형 columnstore 인덱스 비 클러스터형 columnstore 인덱 스는 기존 클러스터형 인덱스 또는 힙 테이블에서 만든 읽기 전용 인덱스입니다. 여기에는 테이블의 모든 열을 포함한 열 하위 집합의 복사본이 들어 있습니다. 테이블은 비클러스터형 columnstore 인덱스를 포함하는 동안 읽기 전용입니다.

비클러스터형 columnstore 인덱스는 원래 테이블에 대해 읽기 전용 작업을 수행하면서 동시에 분석 쿼리를 실행하기 위해 columnstore 인덱스를 포함하는 방법을 제공합니다.

비클러스터형 columnstore 인덱스

클러스터형 columnstore 인덱스 클러스터형 columnstore 인덱 스는 전체 테이블에 대한 물리적 스토리지이며 테이블에 대한 유일한 인덱스입니다. 클러스터형 인덱스는 업데이트할 수 있습니다. 인덱스에 대해 삽입, 삭제 및 업데이트 작업을 수행할 수 있으며, 인덱스로 데이터를 대량 로드할 수 있습니다.

클러스터형 Columnstore 인덱스

열 세그먼트의 조각화를 줄이고 성능을 향상시키기 위해 columnstore 인덱스는 삭제된 행에 대한 ID의 B-트리와 함께 deltastore라는 rowstore 테이블에 일부 데이터를 임시로 저장할 수 있습니다. deltastore 작업은 백그라운드에서 처리됩니다. 정확한 쿼리 결과를 반환하기 위해 클러스터형 columnstore 인덱스는 columnstore와 deltastore의 쿼리 결과를 모두 결합합니다.

deltastore 클러스터형 columnstore 인덱스에만 사용되는 deltastore 는 행 수가 columnstore로 이동할 수 있을 만큼 커질 때까지 행을 저장하는 rowstore 테이블입니다. deltastore는 다른 DML 작업과 로드 성능을 향상을 위해 클러스터형 columnstore 인덱스와 함께 사용됩니다.

대규모 대량 로드 중에 대부분의 행은 deltastore를 통과하지 않고 columnstore로 곧바로 이동합니다. 대량 로드 끝부분의 일부 행은 수가 너무 적어서 행 그룹의 최소 크기(102,400개 행)에 맞지 않을 수 있습니다. 이 경우 최종 행은 columnstore 대신 deltastore로 이동합니다. 행 수가 102,400개 미만인 소규모 대량 로드의 경우 모든 행이 deltastore로 곧바로 이동합니다.

deltastore가 최대 행 수에 도달하면 닫힙니다. tuple-move 프로세스는 닫힌 행 그룹이 있는지 확인합니다. 닫힌 행 그룹을 찾으면 압축하여 columnstore에 저장합니다.

데이터 로드

비클러스터형 columnstore 인덱스로 데이터 로드

비클러스터형 columnstore 인덱스로 데이터를 로드하려면 먼저 데이터를 힙 또는 클러스터형 인덱스로 저장된 기존 rowstore 테이블에 로드한 다음 CREATE COLUMNSTORE INDEX(Transact-SQL)를 사용하여 비클러스터형 columnstore 인덱스 만들기

columnstore 인덱스로 데이터

비클러스터형 columnstore 인덱스가 있는 테이블은 인덱스가 삭제되거나 비활성화될 때까지 읽기 전용입니다. 테이블 및 비클러스터형 columnstore 인덱스를 업데이트하려면 파티션을 내부 및 외부로 전환할 수 있습니다. 인덱스 비활성화, 테이블 업데이트, 인덱스 다시 작성할 수도 있습니다.

자세한 내용은 Using Nonclustered Columnstore Indexes을 참조하세요.

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

클러스터형 columnstore 인덱스로 로드 클러스터

다이어그램에서 알 수 있듯이 클러스터형 columnstore 인덱스에 데이터를 로드하려면 다음을 SQL Server.

  1. 최대 크기의 행 그룹을 columnstore에 직접 삽입합니다. 데이터가 로드되면 SQL Server 선착순으로 데이터 행을 열린 행 그룹에 할당합니다.

  2. 각 행 그룹에 대해 최대 크기에 도달한 후 다음을 SQL Server.

    1. 행 그룹을 CLOSED로 표시합니다.

    2. deltastore를 무시합니다.

    3. columnstore 압축을 사용하여 행 그룹이 있는 각 열 세그먼트를 압축합니다.

    4. 각 압축 열 세그먼트를 columnstore에 물리적으로 저장합니다.

  3. 다음과 같이 나머지 행을 columnstore 또는 deltastore에 삽입합니다.

    1. 행 수가 행 그룹당 최대 행 요구 사항을 충족하면 행이 columnstore에 추가됩니다.

    2. 행 수가 행 그룹당 최대 행보다 적으면 행이 deltastore에 추가됩니다.

deltastore 태스크와 프로세스에 대한 자세한 내용은 Using Clustered Columnstore Indexes을 참조하세요.

성능 팁

병렬로 columnstore 인덱스를 만들기에 충분한 메모리 계획

인덱스 만들기는 메모리가 제한되지 않는 한 기본적으로 병렬 작업입니다. 병렬로 인덱스를 만들려면 직렬로 인덱스를 만들 때보다 많은 메모리가 필요합니다. 메모리가 충분하면 동일한 열에 B-트리를 작성할 때보다 1.5배 많은 메모리가 columnstore 인덱스를 만드는 데 사용됩니다.

columnstore 인덱스를 만드는 데 필요한 메모리는 열 수, 문자열 열 수, DOP(병렬 처리 수준) 및 데이터의 특징에 따라 다릅니다. 예를 들어, 테이블의 행 수가 100만 개 미만일 경우 SQL Server은 한 스레드만 사용하여 columnstore 인덱스를 만듭니다.

테이블 행 수가 100만 개 이상이지만 SQL Server에서 MAXDOP를 사용하여 인덱스를 만들기에 충분한 메모리 부여를 얻을 수 없는 경우 SQL Server에서 사용 가능한 메모리 부여에 맞게 필요한 만큼 자동으로 MAXDOP를 줄입니다. 일부 경우 제한된 메모리로 인덱스를 작성하도록 DOP를 줄여야 합니다.

비클러스터형 columnstore 인덱스

일반 태스크는 Using Nonclustered Columnstore Indexes을 참조하세요.

클러스터형 columnstore 인덱스

일반 태스크는 Using Clustered Columnstore Indexes을 참조하세요.

메타데이터

columnstore 인덱스에 있는 모든 열이 메타데이터에 포괄 열로 저장됩니다. columnstore 인덱스에는 키 열이 없습니다.