Columnstore 인덱스 - 아키텍처Columnstore indexes - architecture

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터 시작)아니요Azure SQL 데이터베이스아니요Azure SQL 데이터 웨어하우스아니요병렬 데이터 웨어하우스THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)noAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

Columnstore 인덱스의 설계 방식을 알아봅니다.Learn how a columnstore index is architected. 이러한 기본 사항을 알면 효과적인 사용 방법을 설명하는 다른 columnstore 문서를 더 쉽게 이해할 수 있습니다.Knowing these basics will make it easier to understand other columnstore articles that explain how to use them effectively.

데이터 저장소는 columnstore 및 rowstore 압축을 사용함Data storage uses columnstore and rowstore compression

Columnstore 인덱스에 대한 설명에서는 데이터 저장소에 대한 형식을 강조하기 위해 rowstorecolumnstore 라는 용어를 사용합니다.In discussions about columnstore indexes, we use the terms rowstore and columnstore to emphasize the format for the data storage. Columnstore 인덱스는 두 가지 유형의 저장소를 사용합니다.Columnstore indexes use both types of storage.

Clustered Columnstore IndexClustered Columnstore Index

  • columnstore 는 열과 행이 있는 테이블로 논리적으로 구성되고 열 데이터 형식으로 물리적으로 저장되는 데이터입니다.A columnstore is data that is logically organized as a table with rows and columns, and physically stored in a column-wise data format.

columnstore 인덱스는 물리적으로 대부분의 데이터를 columnstore 형식으로 저장합니다.A columnstore index physically stores most of the data in columnstore format. columnstore 형식에서는 데이터가 열로 압축되고 압축 해제됩니다.In columnstore format, the data is compressed and uncompressed as columns. 쿼리에서 요청되지 않은 다른 값은 각 행에 압축을 풀지 않아도 됩니다.There is no need to uncompress other values in each row that are not requested by the query. 이렇게 하면 큰 테이블의 전체 열을 빠르게 검색할 수 있습니다.This makes it fast to scan an entire column of a large table.

  • rowstore 는 열과 행이 있는 테이블로 논리적으로 구성되고 행 데이터 형식으로 물리적으로 저장되는 데이터입니다.A rowstore is data that is logically organized as a table with rows and columns, and then physically stored in a row-wise data format. 이는 힙 또는 클러스터형 "btree" 인덱스와 같은 관계형 테이블 데이터를 저장하는 기존 방법이었습니다.This has been the traditional way to store relational table data such as a heap or clustered "btree" index.

또한 columnstore 인덱스는 물리적으로 일부 행을 deltastore라는 rowstore 형식으로 저장합니다.A columnstore index also physically stores some rows in a rowstore format called a deltastore. 델타 행 그룹이라고도 하는 deltastore는 개수가 너무 적어서 columnstore로 압축할 수 없는 행을 보관하는 장소입니다.The deltastore,also called delta rowgroups, is a holding place for rows that are too few in number to qualify for compression into the columnstore. 각 델타 행 그룹은 클러스터형 btree 인덱스로 구현됩니다.Each delta rowgroup is implemented as a clustered btree index.

  • deltastore는 개수가 너무 적어서 columnstore로 압축할 수 없는 행을 보관하는 장소입니다.A deltastore is a a holding place for rows that are too few in number to be compressed into the columnstore. deltastore는 rowstore입니다.The deltastore is a rowstore.

행 그룹 및 열 세그먼트에서 작업이 수행됨Operations are performed on rowgroups and column segments

columnstore 인덱스는 행을 관리할 수 있는 단위로 그룹화합니다.The columnstore index groups rows into manageable units. 이러한 각 단위를 행 그룹이라고 합니다.Each of these units is called a rowgroup. 성능을 최적화하려면 행 그룹의 행 수가 압축률을 높일 만큼 크고, 메모리 내 작업을 활용할 만큼 작아야 합니다.For best performance, the number of rows in a rowgroup is large enough to improve compression rates and small enough to benefit from in-memory operations.

  • 행 그룹은 columnstore 인덱스가 관리 및 압축 작업을 수행하는 행 그룹입니다.A rowgroup is a group of rows on which the columnstore index performs management and compression operations.

예를 들어 columnstore 인덱스는 행 그룹에서 다음 작업을 수행합니다.For example, the columnstore index performs these operations on rowgroups:

  • 행 그룹을 columnstore로 압축합니다.Compresses rowgroups into the columnstore. 압축은 행 그룹 내의 각 열 세그먼트에서 수행됩니다.Compression is performed on each column segment within a rowgroup.
  • ALTER INDEX REORGANIZE 작업 중에 행 그룹을 병합합니다.Merges rowgroups during an ALTER INDEX REORGANIZE operation.
  • ALTER INDEX REBUILD 작업 중에 새 행 그룹을 만듭니다.Creates new rowgroups during an ALTER INDEX REBUILD operation.
  • DMV(동적 관리 뷰)에서 행 그룹 상태 및 조각화를 보고합니다.Reports on rowgroup health and fragmentation in the dynamic management views (DMVs).

deltastore는 델타 행 그룹이라는 하나 이상의 행 그룹으로 구성됩니다.The deltastore is comprised of one or more rowgroups called delta rowgroups. 각 델타 행 그룹은 개수가 너무 적어서 columnstore로 압축할 수 없는 경우 행을 저장하는 클러스터형 btree 인덱스입니다.Each delta rowgroup is a clustered btree index that stores rows when they are too few in number for compression into the columnstore.

  • 델타 행 그룹은 행 그룹에 1,048,576개의 행이 포함되거나 인덱스가 다시 작성될 때까지 작은 대량 로드 및 삽입을 저장하는 클러스터형 btree 인덱스입니다.A delta rowgroup is a clustered btree index that stores small bulk loads and inserts until the rowgroup contains 1,048,576 rows or until the index is rebuilt. 델타 행 그룹에 1,048,576개의 행이 포함된 경우 닫힘으로 표시되고 tuple-mover라는 프로세스가 columnstore로 압축할 때까지 기다립니다.When a delta rowgroup contains 1,048,576 rows it is marked as closed and waits for a process called the tuple-mover to compress it into the columnstore.

행 그룹마다 각 열의 일부 값이 있습니다.Each column has some of its values in each rowgroup. 이러한 값을 열 세그먼트라고 합니다.These values are called column segments. columnstore 인덱스는 행 그룹을 압축할 때 각 열 세그먼트를 개별적으로 압축합니다.When the columnstore index compresses a rowgroup, it compresses each column segment separately. 전체 열의 압축을 풀려면 columnstore 인덱스가 각 행 그룹에서 하나의 열 세그먼트 압축만 풀면 됩니다.To uncompress an entire column, the columnstore index only needs to uncompress one column segment from each rowgroup.

  • 열 세그먼트는 행 그룹에 포함된 열 값의 일부입니다.A column segment is the portion of column values in a rowgroup. 각 행 그룹에는 테이블의 모든 열에 대해 각각 하나의 열 세그먼트가 포함됩니다.Each rowgroup contains one column segment for every column in the table. 행 그룹마다 각 열의 열 세그먼트 하나가 있습니다.|Each column has one column segment in each rowgroup.|

    Column segmentColumn segment

작은 로드 및 삽입은 deltastore로 이동함Small loads and inserts go to the deltastore

columnstore 인덱스는 한 번에 102,400개 이상의 행을 columnstore 인덱스로 압축하여 columnstore 압축 및 성능을 향상합니다.A columnstore index improves columnstore compression and performance by compressing at least 102,400 rows at a time into the columnstore index. 행을 대량으로 압축하기 위해 columnstore 인덱스는 작은 로드 및 삽입을 deltastore에 누적합니다.To compress rows in bulk, the columnstore index accumulates small loads and inserts in the deltastore. deltastore 작업은 백그라운드에서 처리됩니다.The deltastore operations are handled behind the scenes. 정확한 쿼리 결과를 반환하기 위해 클러스터형 columnstore 인덱스는 columnstore와 deltastore의 쿼리 결과를 모두 결합합니다.To return the correct query results, the clustered columnstore index combines query results from both the columnstore and the deltastore.

다음과 같은 경우 행이 deltastore로 이동함Rows go to the deltastore when they are:

  • INSERT INTO VALUES 문을 사용하여 삽입된 경우Inserted with the INSERT INTO VALUES statement.
  • 대량 로드가 끝나고 개수가 102,400개보다 적은 경우At the end of a bulk load and they number less than 102,400.
  • 업데이트된 경우.Updated. 각 업데이트는 삭제와 삽입으로 구현됩니다.Each update is implemented as a delete and an insert.

deltastore는 삭제된 것으로 표시되었지만 columnstore에서 물리적으로 삭제되지 않은 삭제된 행의 ID 목록도 저장합니다.The deltastore also stores a list of IDs for deleted rows that have been marked as deleted but not yet physically deleted from the columnstore.

델타 행 그룹이 꽉 차면 columnstore로 압축됨When delta rowgroups are full they get compressed into the columnstore

클러스터형 columnstore 인덱스는 행 그룹을 columnstore로 압축하기 전에 각 델타 행 그룹에 최대 1,048,576개의 행을 수집합니다.Clustered columnstore indexes collect up to 1,048,576 rows in each delta rowgroup before compressing the rowgroup into the columnstore. 이를 통해 columnstore 인덱스의 압축이 개선됩니다.This improves the compression of the columnstore index. 델타 행 그룹에 1,048,576개의 행이 포함되면 columnstore 인덱스가 행 그룹을 닫힘으로 표시합니다.When a delta rowgroup contains 1,048,576 rows, the columnstore index marks the rowgroup as closed. tuple-mover라는 백그라운드 프로세스가 각 닫힌 행 그룹을 발견하고 columnstore로 압축합니다.A background process, called the tuple-mover, finds each closed rowgroup and compresses it into the columnstore.

ALTER INDEX를 사용하여 인덱스를 다시 작성하거나 다시 구성하면 델타 행 그룹을 columnstore로 강제로 보낼 수 있습니다.You can force delta rowgroups into the columnstore by using ALTER INDEX to rebuild or reorganize the index. 압축하는 동안 메모리 압력이 있을 경우 columnstore 인덱스가 압축된 행 그룹의 행 수를 줄일 수도 있습니다.Note that if there is memory pressure during compression, the columnstore index might reduce the number of rows in the compressed rowgroup.

각 테이블 파티션에 고유한 행 그룹과 델타 행 그룹이 있음Each table partition has its own rowgroups and delta rowgroups

분할 개념은 클러스터형 인덱스, 힙, columnstore 인덱스에서 모두 동일합니다.The concept of partitioning is the same in both a clustered index, a heap, and a columnstore index. 테이블을 분할하면 열 값의 범위에 따라 테이블이 더 작은 행 그룹으로 나뉩니다.Partitioning a table divides the table into smaller groups of rows according to a range of column values. 데이터 관리를 위해 자주 사용됩니다.It is often used for managing the data. 예를 들어 각 연도의 데이터에 대한 파티션을 만들고 파티션 전환을 사용하여 더 저렴한 저장소에 데이터를 보관할 수 있습니다.For example, you could create a partition for each year of data, and then use partition switching to archive data to less expensive storage. 파티션 전환은 columnstore 인덱스에서 수행되며 데이터 파티션을 다른 위치로 쉽게 이동할 수 있게 합니다.Partition switching works on columnstore indexes and makes it easy to move a partition of data to another location.

행 그룹은 항상 테이블 파티션 내에서 정의됩니다.Rowgroups are always defined within a table partition. columnstore 인덱스를 분할하는 경우 각 파티션에 압축된 행 그룹과 델타 행 그룹이 있습니다.When a columnstore index is partitioned, each partition has its own compressed rowgroups and delta rowgroups.

각 파티션에 델타 행 그룹이 여러 개 있을 수 있습니다.Each partition can have multiple delta rowgroups

각 파티션에 델타 행 그룹이 둘 이상 포함될 수 있습니다.Each partition can have more than one delta rowgroups. columnstore 인덱스가 델타 행 그룹에 데이터를 추가해야 하고 델타 행 그룹이 잠겨 있는 경우 columnstore 인덱스는 다른 델타 행 그룹에 대한 잠금을 획득하려고 합니다.When the columnstore index needs to add data to a delta rowgroup and the delta rowgroup is locked, the columnstore index will try to obtain a lock on a different delta rowgroup. 사용할 수 있는 델타 행 그룹이 없으면 columnstore 인덱스에서 새 델타 행 그룹을 만듭니다.If there are no delta rowgroups available, the columnstore index will create a new delta rowgroup. 예를 들어 10개의 파티션이 있는 테이블에 20개 이상의 델타 행 그룹이 쉽게 포함될 수 있습니다.For example, a table with 10 partitions could easily have 20 or more delta rowgroups.

동일한 테이블에서 columnstore 및 rowstore 인덱스를 결합할 수 있습니다.You can combine columnstore and rowstore indexes on the same table

비클러스터형 인덱스는 기본 테이블에 있는 행과 열의 전체 또는 일부에 대한 복사본을 포함합니다.A nonclustered index contains a copy of part or all of the rows and columns in the underlying table. 이 인덱스는 테이블의 하나 이상의 열로 정의되며 행을 필터링하는 선택적 조건이 있습니다.The index is defined as one or more columns of the table, and has an optional condition that filters the rows.

SQL Server 2016SQL Server 2016부터 rowstore 테이블에서 업데이트 가능한 비클러스터형 columnstore 인덱스를 만들 수 있습니다.Beginning with SQL Server 2016SQL Server 2016, you can create an updatable nonclustered columnstore index on a rowstore table. columnstore 인덱스는 데이터 복사본을 저장하므로 추가 저장소가 필요합니다.The columnstore index stores a copy of the data so you do need extra storage. 그러나 columnstore 인덱스의 데이터는 rowstore 테이블보다 작은 크기로 압축됩니다.However, the data in the columnstore index will compress to a smaller size than the rowstore table requires. 따라서 columnstore 인덱스에서 분석을 실행하고 이와 동시에 rowstore 인덱스에서 트랜잭션을 실행할 수 있습니다.By doing this, you can run analytics on the columnstore index and transactions on the rowstore index at the same time. rowstore 테이블의 데이터가 변경되면 columnstore가 업데이트되므로 두 인덱스 모두 동일한 데이터에 대해 작동합니다.The column store is updated when data changes in the rowstore table, so both indexes are working against the same data.

SQL Server 2016SQL Server 2016부터 하나의 클러스터형 columnstore 인덱스에서 하나 이상의 비클러스터형 rowstore 인덱스를 사용할 수 있습니다.Beginning with SQL Server 2016SQL Server 2016, you can have one or more nonclustered rowstore indexes on a columnstore index. 따라서 기본 columnstore에서 효율적인 테이블 찾기를 수행할 수 있습니다.By doing this, you can perform efficient table seeks on the underlying columnstore. 다른 옵션도 사용할 수 있습니다.Other options become available too. 예를 들어 rowstore 테이블에서 UNIQUE 제약 조건을 사용하여 기본 키 제약 조건을 적용할 수 있습니다.For example, you can enforce a primary key constraint by using a UNIQUE constraint on the rowstore table. 고유하지 않은 값은 rowstore 테이블에 삽입하지 못하므로 SQL Server에서 columnstore에 값을 삽입할 수 없습니다.Since an non-unique value will fail to insert into the rowstore table, SQL Server cannot insert the value into the columnstore.

메타데이터Metadata

이러한 메타데이터 뷰를 사용하여 columnstore 인덱스의 특성을 확인할 수 있습니다.Use these metadata views to see attributes of columnstore indexes. 자세한 아키텍처 정보는 이러한 뷰 중 일부에 포함됩니다.More architectural information is embedded in some of these views.

columnstore 인덱스에 있는 모든 열이 메타데이터에 포괄 열로 저장됩니다.Note, all of the columns in a columnstore index are stored in the metadata as included columns. columnstore 인덱스에는 키 열이 없습니다.The columnstore index does not have key columns.

|

다음 단계Next steps

columnstore 인덱스를 디자인하는 방법에 대한 지침은 Columnstore 인덱스 - 디자인 지침을 참조하세요.For guidance on designing your columnstore indexes, see Columnstore indexes - design guidance