[DP-203] Data Storage : Compressing Data in Azure SQL Database

Becoming a Data Engineer ·2024년 1월 11일
0

Azure

목록 보기
14/27

Compression Options


행 저장 객체와 열 저장 객체에 대한 다양한 압축 옵션을 갖고 있다. 각 객체에 대한 압축 옵션은 다음과 같다.

RowstoreColumnstore
Row CompressionColumnstore Compression
Page CompressionColumnstore Archival Compression

파티셔닝된 인덱스와 테이블의 경우, 각 파티션에 다른 압축 유형을 혼합하여 사용할 수 있다. 다른 파티션들은 동일한 압축 옵션을 가질 필요가 없다.

Rowstore, 행 저장

1) Row Compression

  • 목적
    행 단위로 데이터를 압축하여 저장 공간을 절약하고, 디스크 I/O를 줄이는 데 목적이 있다. 이 압축 방식은 데이터의 실제 필요 크기에 맞춰 저장 공간을 동적으로 조정함으로써 공간을 절약한다.

  • 압축 수준
    상대적으로 낮은 압축률을 제공하지만, 압축과 압축 해제 과정에서의 CPU 오버헤드가 비교적 낮다. 이로 인해 쿼리 성능에 미치는 영향이 적어, 자주 액세스되는 데이터에 적용하기 적합하다.

  • 사용 시나리오
    고정 길이 데이터 필드를 가진 테이블에서 더 큰 이점을 볼 수 있다. 또한, 데이터의 크기가 열의 최대 크기보다 작은 경우에 효과적이며, 특히 공간 절약이 중요하지만 쿼리 성능에 큰 영향을 주고 싶지 않은 경우에 적합하다.

2) Page Compression

Page Compression은 Row Compression 도 포함하고 있다. 그 이후에는 중복된 패턴을 찾아내어 더 작은 값으로 교체한다. 이는 주로 중복이 많은 데이터에서 높은 효과를 보이며, 중복이 적은 경우에는 압축 효과가 감소할 수 있다. 왜냐하면 찾아서 대체할 반복 패턴이 없기 때문이다.

  • 목적
    데이터를 페이지 단위로 압축하여 더 높은 압축률을 달성하고, 저장 공간을 크게 절약하는 데 목적이 있다. 이 방식은 Row Compression을 포함하며, 추가적으로 프리픽스 압축과 딕셔너리 압축을 사용한다.

  • 압축 수준
    높은 압축률을 제공한다. 이는 데이터의 반복되는 패턴을 식별하고 이를 효율적으로 압축하여 달성된다. 다만, 압축과 압축 해제 과정에서 CPU 사용량이 증가할 수 있다.

  • 사용 시나리오
    대량의 반복 데이터를 포함하는 테이블에 특히 유용하다. 페이지 압축은 저장 공간 절약을 최대화하고자 할 때, 특히 데이터 액세스 패턴이 비교적 덜 빈번한 경우에 이상적이다.

Columnstore, 열 저장

1) Columnstore Compression (on by default)

기본적으로 모든 Columnstore 객체가 Columnstore Compression 을 갖고 있다. 기본 값이기 때문에 별도 설정이 불가능하다.

  • 목적
    데이터를 열별로 저장하고 압축하여, 쿼리 성능을 최적화한다. 대규모 데이터웨어하우스와 OLAP(Online Analytics Processing) 시스템에서 자주 사용된다.

  • 압축 수준
    표준 압축 수준을 제공하며, 쿼리 성능과 저장 공간 효율 사이의 균형을 맞춘다. 데이터를 열별로 분리하여 저장함으로써, 쿼리가 필요로 하는 데이터에 빠르게 엑세스할 수 있도록 한다.

  • 사용 시나리오
    자주 접근되거나 쿼리 성능이 중요한 데이터에 주로 사용된다. 압축을 통해 저장 공간을 절약하면서도, 데이터 액세스 속도에 미치는 영향을 최소화하려는 경우에 적합하다.

그러나 더 압축하고 싶다면, Columnstore Archival Compression 이 있다.

2) Columnstore Archival Compression

  • 목적
    보다 고도의 압축을 제공하여, 저장 공간을 최대한으로 절약하기 위해 설계되었다. 주로 접근 빈도가 낮은 장기 보관 데이터에 사용된다.

  • 압축 수준
    Columnstore Compression에 비해 더 높은 압축 비율을 제공한다. 이는 데이터를 아카이브할 때 유용하며, 저장 비용을 크게 절감할 수 있다. 다만, 높은 압축률 때문에 데이터 액세스 시 약간 더 많은 시간이 소요될 수 있다.

  • 사용 시나리오
    자주 사용되지 않거나, 쿼리 속도보다는 저장 공간 절약이 더 중요한 데이터에 적합하다. (예. 규제 준수를 위해 오랜 기간 데이터를 보관해야 하는 경우)

어떤 종류의 객체를 가지고 있던, 어느 정도의 압축을 선택하던, Azure SQL Database와 클라우드의 큰 이점 중 하나는 이 모든 것이 통합되어 있다는 것이다.

Compression of Rowstore Objects


  • Storage Saving, 저장 공간 절약
    Reduce the size of the database.

  • Improved I/O Performance
    Data is stored in fewer pages.
    데이터는 더 적은 페이지에 저장되어, 작업을 수행할 때 검색해야 하는 페이지 수도 더 적다.

Used on Rowstore Objects

사용될 수 있는 객체의 타입은 ...

  • Heap Table
  • Clustered Index
    즉, 클러스터드 인덱스가 있는 테이블을 의미하는 것과 동일하며, 이는 클러스터드 인덱스로 저장된다.
  • Nonclustered Index
  • Indexed View

인덱스와 클러스터링

데이터베이스에서 인덱스특정 열(또는 여러 열)의 값을 사용하여 테이블의 특정 행에 빠르게 액세스 할 수 있게 해주는 데이터 구조이다. 인덱스를 사용하면 데이터베이스 엔진은 검색이나 정렬을 빠르게 수행할 수 있다.

클러스터링데이터의 물리적인 저장 순서를 의미한다. 클러스터링된 테이블은 특정 열(또는 열의 조합)을 기준으로 데이터를 물리적으로 정렬하여 저장한다. 이로 인해 해당 열을 기준으로 검색 또는 정렬할 때 효율적인 성능을 얻을 수 있다.

Clustered Index, 클러스터형 인덱스

  • 클러스터형 인덱스는 테이블의 실제 데이터의 물리적인 순서와 동일하다.
  • 클러스터형 인덱스를 가지는 열(또는 열의 조합)은 테이블의 데이터를 정렬하는 기준이 된다.
  • 클러스터형 인덱스가 설정된 열을 기준으로 데이터를 찾거나 정렬하는 작업이 매우 효율적으로 이루어진다.
  • 하나의 테이블에는 하나의 클러스터형 인덱스만 존재할 수 있다.

클러스터형 인덱스는 주로 검색 성능을 향상시키기 위해 사용되며, 테이블의 데이터를 물리적으로 정렬함으로써 디스크 I/O를 최소화한다. 그러나 클러스터형 인덱스를 사용할 때 삽입, 업데이트, 삭제와 같은 데이터 변경 작업은 느려질 수 있다. 이는 새로운 데이터가 정렬된 위치에 삽입되거나, 기존의 데이터가 업데이트되거나 삭제될 때 해당 테이블의 물리적인 구조를 변경해야 하기 때문이다.

고려사항

  • Azure SQL Database 에서 사용할 수 있지만, SQL Server의 모든 버전에서 사용할 수 있는 것은 아니다.
  • 최대 row size와 압축 오버헤드의 합이 8060 바이트를 초과할 수 없다.
  • ROW 또는 PAGE 압축은 온라인이나 오프라인 모두에서 활성화 또는 비활성화 할 수 있다. 따라서 해당 압축을 활성화하면서도 production workloads를 계속 유지할 수 있는 옵션이 있어 좋다.
  • 인덱스를 생성하거나 재구성할 때와 마찬가지로 활성화 또는 비활성화 할 때의 디스크 공간 요구사항이 동일하다.

예시

Production.TransactionHistory 테이블의 모든 파티션을 다시 빌드하고 행 단위의 데이터 압축을 사용하여 변경하는 명령문

  • ALTER TABLE Production.TransactionHistory
    Production.TransactionHistory 테이블을 수정하겠다는 의미
  • REBUILD PARTITION = ALL
    • 모든 파티션을 다시 빌드하겠다는 의미
    • 테이블의 데이터를 다시 정렬하고 압축하는 작업
    • 일종의 인덱스 리빌딩이라고 생각할 수 있다.
  • WITH (DATA_COMPRESSION = ROW)
    • ROW 옵션은 행 단위의 데이터 압축을 의미
    • 데이터 압축은 저장 공간을 절약하고 일부 쿼리 성능을 향상시킬 수 있습니다.

Compression of Columnstore Objects


  • Columnstore Compression by Default
    모든 Columnstore Objects에서 이 기능을 사용하도록 설정했다.
    기본 값이기 때문에 사용자가 별도 설정이 불가능하다.
  • 더욱 압축하고 싶다면, Columnstore Archival Compression 있다.
    데이터의 크기를 줄이고 데이터를 검색하는 데 필요한 추가 CPU와 시간 오버헤드를 감당할 수 있을 때 이를 사용한다.

Used on Columnstore Objects

사용될 수 있는 객체의 타입은 ...

  • Columnstore Table or Clustered Index
    클러스터링된 인덱스로 저장된 컬럼 스토어 테이블은 동일한 개념이다.
  • Nonclustered Columnsotre Index

고려사항

  • Columnstore Archival Compression 을 가진 인덱스는 더 느리다.
    • 주로 이를 사용하여, 자주 접근하지 않는 데이터의 크기를 줄인다.

예시


Review


  • For rowstore objects,
    you can use row or page compression
  • Columnstore objects have
    columnstore compression by default
  • For additional size reduction on columnstore objects,
    columnstore archival compression can be enabled.
profile
I want to improve more 👩🏻‍💻

0개의 댓글

관련 채용 정보