SQL Server 메모리 내 컬럼스토어 인덱스는 열 기반 데이터 저장소 및 열 기반 쿼리 처리를 사용하여 데이터를 저장하고 관리합니다. Columnstore 인덱스는 주로 대량 로드 및 읽기 전용 쿼리를 수행하는 데이터 웨어하우징 워크로드에 적합합니다. columnstore 인덱스를 사용하여 기존 행 지향 스토리지보다 최대 10배의 쿼리 성능 향상을 달성하고 압축되지 않은 데이터 크기에 대해 최대 7배의 데이터 압축 을 달성할 수 있습니다.
비고
클러스터형 columnstore 인덱스를 대용량 데이터 웨어하우징 팩트 테이블을 저장하기 위한 표준으로 보고 대부분의 데이터 웨어하우징 시나리오에서 사용될 것으로 예상합니다. 클러스터형 columnstore 인덱스를 업데이트할 수 있으므로 워크로드에서 많은 수의 삽입, 업데이트 및 삭제 작업을 수행할 수 있습니다.
목차
기본 사항
columnstore 인덱스는 columnstore라는 열 형식 데이터 형식을 사용하여 데이터를 저장, 검색 및 관리하는 기술입니다. SQL Server는 클러스터형 및 비클러스터형 columnstore 인덱스를 모두 지원합니다. 둘 다 동일한 메모리 내 columnstore 기술을 사용하지만 목적과 지원하는 기능에는 차이가 있습니다.
혜택
Columnstore 인덱스는 대용량 데이터 집합에 대한 분석을 수행하는 읽기 전용 쿼리에 적합합니다. 데이터 웨어하우징 워크로드에 대한 쿼리인 경우가 많습니다. Columnstore 인덱스는 전체 테이블 검색을 사용하는 쿼리에 대해 고성능 향상을 제공하며 특정 값을 검색하여 데이터를 검색하는 쿼리에는 적합하지 않습니다.
Columnstore 인덱스 이점:
열에 비슷한 데이터가 있는 경우가 많으므로 압축 속도가 높습니다.
압축 비율이 높으면 메모리 내 사용 공간이 감소되어 쿼리 성능이 향상됩니다. SQL Server는 메모리 내 더 많은 쿼리 및 데이터 작업을 수행할 수 있으므로 쿼리 성능이 향상될 수 있습니다.
일괄 처리 모드 실행이라는 새로운 쿼리 실행 메커니즘이 SQL Server에 추가되어 CPU 사용량을 크게 줄입니다. 일괄 처리 모드 실행은 columnstore 스토리지 형식과 긴밀하게 통합되고 최적화됩니다. 일괄 처리 모드 실행을 벡터 기반 또는 벡터화된 실행이라고도 합니다.
쿼리는 종종 테이블에서 몇 개의 열만 선택하여 실제 미디어의 총 I/O를 줄입니다.
Columnstore 버전
SQL Server 2012, SQL Server 2012 병렬 데이터 웨어하우스 및 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 인덱스 A columnstore 인덱스는 columnstore 라는 열 형식 데이터 형식을 사용하여 데이터를 저장, 검색 및 관리하기 위한 기술입니다. SQL Server는 클러스터형 및 비클러스터형 columnstore 인덱스를 모두 지원합니다. 둘 다 동일한 메모리 내 columnstore 기술을 사용하지만 목적과 지원하는 기능에는 차이가 있습니다.
columnstore A columnstore 는 행과 열이 있는 테이블로 논리적으로 구성되고 실제로 열 단위 데이터 형식으로 저장된 데이터입니다.
rowstore A rowstore 는 행과 열이 있는 테이블로 논리적으로 구성된 다음 행 단위 데이터 형식으로 물리적으로 저장되는 데이터입니다. 이것은 관계형 테이블 데이터를 저장하는 기존의 방법이었습니다.
행 그룹 및 열 세그먼트 고성능 및 높은 압축 속도를 위해 columnstore 인덱스는 테이블을 행 그룹이라고 하는 행 그룹으로 분할한 다음 각 행 그룹을 열 단위로 압축합니다. 행 그룹의 행 수는 압축 속도를 향상시킬 만큼 충분히 크고 메모리 내 작업의 이점을 얻을 수 있을 만큼 작아야 합니다.
행 그룹 A 행 그룹은 동시에 columnstore 형식으로 압축되는 행 그룹입니다.
열 세그먼트 A 열 세그먼트 는 행 그룹 내의 데이터 열입니다.
행 그룹에는 일반적으로 행 그룹당 최대 행 수가 포함되며 행 수는 1,048,576개입니다.
각 행 그룹에는 테이블의 모든 열에 대해 하나의 열 세그먼트가 포함됩니다.
각 열 세그먼트는 함께 압축되며 실제 미디어에 저장됩니다.
비클러스터형 columnstore 인덱스 A 비클러스터형 columnstore 인덱 스는 기존 클러스터형 인덱스 또는 힙 테이블에서 만든 읽기 전용 인덱스입니다. 여기에는 테이블의 모든 열을 포함하여 열 하위 집합의 복사본이 포함됩니다. 테이블은 비클러스터형 columnstore 인덱스를 포함하는 동안 읽기 전용입니다.
비클러스터형 columnstore 인덱스는 분석 쿼리를 실행하기 위한 columnstore 인덱스를 사용하는 동시에 원래 테이블에서 읽기 전용 작업을 수행하는 방법을 제공합니다.
클러스터형 columnstore 인덱스 A 클러스터형 columnstore 인덱 스는 전체 테이블에 대한 물리적 스토리지이며 테이블에 대한 유일한 인덱스입니다. 클러스터형 인덱스는 업데이트할 수 있습니다. 인덱스에 대한 삽입, 삭제 및 업데이트 작업을 수행할 수 있으며 인덱스에 데이터를 대량 로드할 수 있습니다.
열 세그먼트의 조각화를 줄이고 성능을 향상시키기 위해 columnstore 인덱스는 일부 데이터를 deltastore라는 rowstore 테이블에 임시로 저장하고 삭제된 행에 대한 ID의 B-트리를 저장할 수 있습니다. deltastore 작업은 백그라운드에서 처리됩니다. 정확한 쿼리 결과를 반환하기 위해 클러스터형 columnstore 인덱스는 columnstore와 deltastore의 쿼리 결과를 모두 결합합니다.
deltastore 클러스터형 columnstore 인덱스에만 사용되며 deltastore 는 행 수가 columnstore로 이동할 수 있을 만큼 커질 때까지 행을 저장하는 rowstore 테이블입니다. deltastore는 클러스터형 columnstore 인덱스와 함께 사용하여 로드 및 기타 DML 작업의 성능을 향상시킵니다.
대량 데이터 로드 시 대부분의 행은 "deltastore"를 통과하지 않고 "columnstore"로 직접 이동합니다. 대량 로드의 끝에 있는 일부 행은 102,400개 행인 행 그룹의 최소 크기를 충족하기에는 너무 적을 수 있습니다. 이 경우 최종 행은 columnstore 대신 deltastore로 이동합니다. 행이 102,400개 미만인 소규모 대량 로드의 경우 모든 행이 deltastore로 직접 이동합니다.
deltastore가 최대 행 수에 도달하면 닫힙니다. 튜플 이동 프로세스는 닫힌 행 그룹을 확인합니다. 닫힌 행 그룹을 찾으면 압축하고 columnstore에 저장합니다.
데이터 로드
비클러스터형 Columnstore 인덱스로 데이터 로드
비클러스터형 columnstore 인덱스로 데이터를 로드하려면 먼저 데이터를 힙 또는 클러스터형 인덱스로 저장된 기존 rowstore 테이블에 로드한 다음 CREATE COLUMNSTORE INDEX(Transact-SQL)를 사용하여 비클러스터형 columnstore 인덱스 만들기
비클러스터형 columnstore 인덱스가 있는 테이블은 인덱스가 삭제되거나 비활성화될 때까지 읽기 전용입니다. 테이블 및 비클러스터형 columnstore 인덱스를 업데이트하려면 파티션을 내부 및 외부로 전환할 수 있습니다. 인덱스 비활성화, 테이블 업데이트, 인덱스 다시 작성할 수도 있습니다.
자세한 내용은 비클러스터형 Columnstore 인덱스 사용을 참조하세요.
클러스터형 Columnstore 인덱스로 데이터 로드
다이어그램에서 알 수 있듯이 클러스터형 columnstore 인덱스에 데이터를 로드하려면 SQL Server:
최대 크기 행 그룹을 columnstore에 직접 삽입합니다. 데이터가 로드되면 SQL Server는 선착순으로 데이터 행을 열린 행 그룹에 할당합니다.
각 행 그룹에 대해 최대 크기에 도달하면 SQL Server:
행 그룹을 CLOSED로 표시합니다.
deltastore를 바이패스합니다.
각 열 세그먼트를 열 저장소 압축을 사용하여 행 그룹과 함께 압축합니다.
압축된 각 열 세그먼트를 columnstore에 물리적으로 저장합니다.
다음과 같이 나머지 행을 columnstore 또는 deltastore에 삽입합니다.
행 수가 행 그룹 요구 사항당 최소 행을 충족하는 경우 행이 columnstore에 추가됩니다.
행 수가 행 그룹당 최소 행 수보다 작으면 행이 deltastore에 추가됩니다.
deltastore 작업 및 프로세스에 대한 자세한 내용은 클러스터형 Columnstore 인덱스 사용을 참조하세요.
성능 팁
병렬로 columnstore 인덱스를 만들기 위한 충분한 메모리를 계획하십시오.
인덱스 만들기는 메모리가 제한되지 않는 한 기본적으로 병렬 작업입니다. 병렬로 인덱스를 만들려면 직렬로 인덱스를 만들 때보다 많은 메모리가 필요합니다. 메모리가 충분하면 동일한 열에 B-트리를 작성할 때보다 1.5배 많은 메모리가 columnstore 인덱스를 만드는 데 사용됩니다.
columnstore 인덱스를 만드는 데 필요한 메모리는 열 수, 문자열 열 수, DOP(병렬 처리 수준), 데이터의 특성에 따라 달라집니다. 예를 들어 테이블에 100만 개 미만의 행이 있는 경우 SQL Server는 하나의 스레드만 사용하여 columnstore 인덱스를 만듭니다.
테이블에 100만 개 이상의 행이 있지만 SQL Server가 MAXDOP를 사용하여 인덱스를 만들 만큼 충분한 메모리 부여를 얻을 수 없는 경우 SQL Server는 사용 가능한 메모리 부여에 맞게 필요에 따라 MAXDOP를 자동으로 줄입니다. 일부 경우 제한된 메모리로 인덱스를 작성하도록 DOP를 줄여야 합니다.
관련 작업 및 항목
비클러스터형 Columnstore 인덱스
일반적인 작업은 비클러스터형 Columnstore 인덱스 사용을 참조하세요.
클러스터형 columnstore 인덱스
일반적인 작업은 클러스터형 Columnstore 인덱스 사용을 참조하세요.
ALTER INDEX(Transact-SQL)에 REBUILD 또는 REORGANIZE를 사용하십시오.
메타데이터
columnstore 인덱스에 있는 모든 열이 메타데이터에 포괄 열로 저장됩니다. columnstore 인덱스에는 키 열이 없습니다.