데이터 압축

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

SQL Server, Azure SQL Database 및 Azure SQL Managed Instance는 rowstore 테이블 및 인덱스에 대한 행 및 페이지 압축을 지원하고 columnstore 테이블 및 인덱스에 대한 columnstore 및 columnstore 보관 압축을 지원합니다.

rowstore 테이블 및 인덱스의 경우 데이터 압축 기능을 사용하여 데이터베이스 크기를 줄입니다. 데이터 압축은 공간을 절약하는 것 외에도 데이터가 적은 페이지에 저장되고 쿼리가 디스크에서 더 적은 페이지를 읽어야 하므로 I/O 집약적 워크로드의 성능을 향상시키는 데 도움이 될 수 있습니다. 그러나 데이터를 애플리케이션과 교환하는 동안 데이터를 압축하고 압축 해제하기 위해 데이터베이스 서버에 추가 CPU 리소스가 필요합니다. 다음 데이터베이스 개체에서 행 및 페이지 압축을 구성할 수 있습니다.

  • 힙으로 저장되는 전체 테이블
  • 클러스터형 인덱스로 저장되는 전체 테이블
  • 전체 비클러스터형 인덱스입니다.
  • 전체 인덱싱된 뷰입니다.
  • 분할된 테이블 및 인덱스의 경우 각 파티션에 대한 압축 옵션을 구성할 수 있으며 개체의 다양한 파티션에는 동일한 압축 설정이 필요하지 않습니다.

columnstore 테이블 및 인덱스의 경우 모든 columnstore 테이블 및 인덱스는 항상 columnstore 압축을 사용하며 사용자가 구성할 수 없습니다. columnstore 보관 압축을 사용하여 데이터를 저장하고 검색하는 데 추가 시간과 CPU 리소스를 사용할 수 있는 상황에서 데이터 크기를 더 줄일 수 있습니다. 다음 데이터베이스 개체에서 columnstore 보관 압축을 구성할 수 있습니다.

  • 전체 columnstore 테이블 또는 전체 클러스터형 columnstore 인덱스입니다. columnstore 테이블은 클러스터형 columnstore 인덱스로 저장되므로 두 방법 모두 동일한 결과를 갖습니다.
  • 전체 비클러스터형 columnstore 인덱스입니다.
  • 분할된 columnstore 테이블 및 columnstore 인덱스의 경우 각 파티션에 대한 보관 압축 옵션을 구성할 수 있으며, 다양한 파티션에 동일한 보관 압축 설정이 필요하지 않습니다.

참고 항목

데이터는 GZIP 알고리즘 형식을 사용하여 압축될 수도 있습니다. 이는 추가 단계이며 장기 스토리지를 위해 이전 데이터를 보관할 때 데이터의 일부를 압축하는 데 가장 적합합니다. 함수를 COMPRESS 사용하여 압축된 데이터는 인덱싱할 수 없습니다. 자세한 내용은 COMPRESS(Transact-SQL)를 참조하세요.

행 및 페이지 압축 고려 사항

행 및 페이지 압축을 사용할 때 다음 사항을 고려해야 합니다.

  • 데이터 압축의 세부 사항은 서비스 팩이나 후속 릴리스에서 예고 없이 변경될 수 있습니다.

  • 압축은 Azure SQL Database에서 사용할 수 있습니다.

  • 일부 SQL Server 버전에서는 압축을 사용할 수 없습니다. 자세한 내용은 이 섹션의 끝에 있는 버전 및 지원되는 기능 목록을 참조하세요.

  • 시스템 테이블에는 압축을 사용할 수 없습니다.

  • 압축을 사용하면 페이지에 더 많은 행을 저장할 수 있지만 테이블 또는 인덱스의 최대 행 크기는 변경되지 않습니다.

  • 최대 행 크기와 압축 오버헤드가 최대 행 크기 8,060바이트를 초과하는 경우 테이블을 압축할 수 없습니다. 예를 들어 열 c1 CHAR(8000) 이 있고 c2 CHAR(53) 추가 압축 오버헤드로 인해 압축할 수 없는 테이블입니다. vardecimal 스토리지 형식을 사용하면 형식을 사용할 때 행 크기 검사 수행됩니다. 행 및 페이지 압축의 경우 개체가 처음 압축될 때 행 크기 검사 수행된 다음 각 행을 삽입하거나 수정할 때 검사. 압축에는 다음 두 가지 규칙이 적용됩니다.

    • 고정 길이 형식으로의 업데이트가 항상 성공해야 합니다.
    • 데이터 압축 비활성화에 항상 성공해야 합니다. 압축된 행이 페이지에 맞더라도 8,060바이트 미만입니다. SQL Server는 압축을 풀 때 행에 맞지 않는 업데이트를 방지합니다.
  • 데이터 압축을 사용하도록 설정할 때는 행이 아닌 데이터가 압축되지 않습니다. 예를 들어 8,060바이트보다 큰 XML 레코드는 압축되지 않은 행 외부 페이지를 사용합니다.

  • 여러 데이터 형식은 데이터 압축의 영향을 받지 않습니다. 자세한 내용은 행 압축이 스토리지에 미치는 영향을 참조하세요.

  • 파티션 목록을 지정하면 압축 형식을 개별 파티션 또는 개별 파티션으로 ROWPAGENONE 설정할 수 있습니다. 파티션 목록을 지정하지 않으면 문에 지정된 데이터 압축 속성을 사용하여 모든 파티션이 설정됩니다. 테이블이나 인덱스를 만들 때 달리 지정하지 않는 한 데이터 압축이 NONE으로 설정됩니다. 테이블을 수정할 경우에는 달리 지정하지 않는 한 기존 압축이 유지됩니다.

  • 범위를 벗어난 파티션 목록 또는 파티션을 지정하면 오류가 생성됩니다.

  • 비클러스터형 인덱스는 테이블의 압축 속성을 상속하지 않습니다. 인덱스를 압축하려면 인덱스의 압축 속성을 명시적으로 설정해야 합니다. 기본적으로 인덱스를 만들 때 인덱스의 압축 설정은 NONE으로 설정됩니다.

  • 힙에 클러스터형 인덱스를 만드는 경우 이 클러스터형 인덱스는 다른 압축 상태를 지정하지 않는 한 힙의 압축 상태를 상속합니다.

  • 힙이 페이지 수준 압축을 사용하도록 구성된 경우 페이지는 다음과 같은 방식으로만 페이지 수준 압축을 받습니다.

    • 대량 최적화를 사용하도록 설정하여 데이터를 대량으로 가져옵니다.
    • 데이터는 구문을 사용하여 INSERT INTO ... WITH (TABLOCK) 삽입되고 테이블에 비클러스터형 인덱스가 없습니다.
    • 압축 옵션을 사용하여 문을 PAGE 실행하여 ALTER TABLE ... REBUILD 테이블을 다시 작성합니다.
  • DML 작업의 일부로 힙에 할당된 새 페이지는 힙이 다시 작성될 때까지 압축을 사용하지 PAGE 않습니다. 압축을 제거하고 다시 적용하거나 클러스터형 인덱스 만들기 및 제거를 통해 힙을 다시 빌드합니다.

  • 힙의 압축 설정을 변경하는 경우 힙의 새 행 위치에 대한 포인터를 포함하도록 테이블의 모든 비클러스터형 인덱스를 다시 작성해야 합니다.

  • 온라인 또는 오프라인에서 사용하거나 사용하지 않도록 설정 ROW 하거나 PAGE 압축할 수 있습니다. 힙에서 압축을 사용하도록 설정하는 것은 온라인 작업의 경우 단일 스레드입니다.

  • 행 또는 페이지 압축을 사용하거나 사용하지 않도록 설정하기 위한 디스크 공간 요구 사항은 인덱스를 만들거나 다시 빌드하는 경우와 동일합니다. 분할된 데이터의 경우 한 번에 하나의 파티션에 대해 압축을 사용하거나 사용하지 않도록 설정하여 필요한 공간을 줄일 수 있습니다.

  • 분할된 테이블의 파티션 압축 상태를 확인하려면 카탈로그 뷰의 sys.partitions 열을 쿼리 data_compression 합니다.

  • 인덱스를 압축하면 리프 수준 페이지를 행 및 페이지 압축으로 압축할 수 있습니다. 리프 수준이 아닌 페이지는 페이지 압축을 받지 않습니다.

  • 크기 때문에 대용량 데이터 형식은 특수 목적 페이지의 일반 행 데이터와 별도로 저장되는 경우가 있습니다. 별도로 저장된 데이터에는 데이터 압축을 사용할 수 없습니다.

  • SQL Server 2005(9.x)에서 vardecimal 스토리지 형식을 구현한 테이블은 업그레이드 시 해당 설정을 유지합니다. vardecimal 스토리지 형식의 테이블에 행 압축을 적용할 수 있습니다. 그러나 행 압축은 vardecimal 스토리지 형식의 상위 집합이므로 vardecimal 스토리지 형식을 유지할 이유가 없습니다. vardecimal 스토리지 형식을 행 압축과 결합하면 10진수 값은 추가 압축을 얻지 않습니다. vardecimal 스토리지 형식이 있는 테이블에 페이지 압축을 적용할 수 있지만 vardecimal 스토리지 형식 열은 추가 압축을 달성하지 못할 수 있습니다.

    참고 항목

    지원되는 모든 버전의 SQL Server는 vardecimal 스토리지 형식을 지원합니다. 그러나 데이터 압축이 동일한 목표를 달성하기 때문에 vardecimal 스토리지 형식은 더 이상 사용되지 않습니다. 이 기능은 이후 버전의 SQL Server에서 제거됩니다. 새 개발 작업에서는 이 기능을 사용하지 않도록 하고, 현재 이 기능을 사용하는 애플리케이션은 수정하세요.

Windows의 SQL Server 버전에서 지원하는 기능 목록은 다음을 참조하세요.

Columnstore 및 columnstore 보관 압축

Columnstore 테이블 및 인덱스는 항상 columnstore 압축과 함께 저장됩니다. 보관 압축이라는 추가 압축을 구성하여 columnstore 데이터의 크기를 더 줄일 수 있습니다. 보관 압축을 수행하기 위해 SQL Server는 데이터에 대해 Microsoft XPRESS 압축 알고리즘을 실행합니다. 다음 데이터 압축 형식을 사용하여 보관 압축을 추가하거나 제거합니다.

  • 보관 압축으로 columnstore 데이터를 압축하려면 COLUMNSTORE_ARCHIVE 데이터 압축을 사용하십시오.
  • 데이터 압축을 사용하여 COLUMNSTORE 보관 압축을 압축 해제합니다. 결과 데이터는 columnstore 압축을 사용하여 계속 압축됩니다.

보관 압축을 추가하려면 옵션과 DATA COMPRESSION = COLUMNSTORE_ARCHIVE함께 ALTER TABLE(Transact-SQL) 또는 ALTER INDEX(Transact-SQL)를 사용합니다REBUILD.

예시:

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (2, 4)
);

보관 압축을 제거하고 데이터를 columnstore 압축으로 복원하려면 옵션과 DATA COMPRESSION = COLUMNSTORE함께 ALTER TABLE(Transact-SQL) 또는 ALTER INDEX(Transact-SQL)를 사용합니다REBUILD.

예시:

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = 1 WITH (
     DATA_COMPRESSION = COLUMNSTORE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE
);

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE ON PARTITIONS (2, 4)
);

다음은 데이터 압축을 일부 파티션의 columnstore로 설정하고 다른 파티션의 columnstore 보관으로 설정하는 예제입니다.

ALTER TABLE ColumnstoreTable1
REBUILD PARTITION = ALL WITH (
    DATA_COMPRESSION = COLUMNSTORE
        ON PARTITIONS (4, 5),
    DATA COMPRESSION = COLUMNSTORE_ARCHIVE
        ON PARTITIONS (1, 2, 3)
);

성능

보관 압축을 사용하여 columnstore 인덱스를 압축하면 인덱스가 보관 압축이 없는 columnstore 인덱스보다 느리게 수행됩니다. 추가 시간 및 CPU 리소스를 사용하여 데이터를 압축하고 검색할 수 있는 경우에만 보관 압축을 사용합니다.

보관 압축의 이점은 스토리지를 줄여 자주 액세스하지 않는 데이터에 유용합니다. 예를 들어, 월별 데이터에 대해 파티션이 있고 대부분의 작업이 가장 최근 월에 대한 작업인 경우 스토리지 요구 사항을 줄이기 위해 이전 월을 보관할 수 있습니다.

메타데이터

다음 시스템 뷰에는 클러스터형 인덱스의 데이터 압축에 대한 정보가 포함되어 있습니다.

프로시저 sp_estimate_data_compression_savings(Transact-SQL) 도 columnstore 인덱스에 적용할 수 있습니다.

분할된 테이블 및 인덱스에 미치는 영향

분할된 테이블 및 인덱스와 함께 데이터 압축을 사용하는 경우 다음 사항을 고려해야 합니다.

  • 문을 사용하여 파티션을 분할하는 ALTER PARTITION 경우 두 파티션은 원래 파티션의 데이터 압축 특성을 상속합니다.

  • 두 파티션이 병합되면 결과 파티션은 대상 파티션의 데이터 압축 특성을 상속합니다.

  • 파티션을 전환하려면 파티션의 데이터 압축 속성이 테이블의 압축 속성과 일치해야 합니다.

  • 분할된 테이블 또는 인덱스의 압축을 수정하는 데 사용할 수 있는 두 가지 구문 변형이 있습니다.

    • 다음 구문은 참조된 파티션만 다시 작성합니다.

      ALTER TABLE <table_name>
      REBUILD PARTITION = 1 WITH (
          DATA_COMPRESSION = <option>
      );
      
    • 다음 구문은 참조되지 않는 파티션에 대해 기존 압축 설정을 사용하여 전체 테이블을 다시 작성합니다.

      ALTER TABLE <table_name>
      REBUILD PARTITION = ALL WITH (
          DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),
          ...
      );
      

    분할된 인덱스는 .를 사용하여 ALTER INDEX동일한 원칙을 따릅니다.

  • 클러스터형 인덱스를 삭제한 경우 파티션 구성표를 수정하지 않으면 해당 힙 파티션에서 데이터 압축 설정이 유지됩니다. 파티션 구성표를 변경하는 경우 모든 파티션이 압축되지 않은 상태로 다시 작성됩니다. 클러스터형 인덱스를 삭제하고 분할 체계를 변경하려면 다음 단계가 필요합니다.

    1. 클러스터형 인덱스를 삭제합니다.
    2. 압축 옵션을 지정하는 옵션을 사용하여 ALTER TABLE ... REBUILD 테이블을 수정합니다.

    클러스터형 인덱스를 삭제하는 것은 클러스터형 인덱 OFFLINE 스의 상위 수준만 제거되기 때문에 빠른 작업입니다. 클러스터형 인덱스가 삭제되면 ONLINESQL Server는 1단계에서 한 번, 2단계에서 한 번씩 힙을 두 번 다시 빌드해야 합니다.

압축이 복제에 미치는 영향

복제본(replica) 데이터 압축을 사용하는 경우 다음 사항을 고려해야 합니다.

  • 스냅샷 에이전트에서 초기 스키마 스크립트를 생성할 때 새 스키마는 테이블과 해당 인덱스 모두에 대해 동일한 압축 설정을 사용합니다. 인덱스가 아닌 테이블만 압축을 사용하도록 설정할 수 없습니다.

  • 트랜잭션 복제본(replica)의 경우 아티클 스키마 옵션은 스크립션해야 하는 종속 개체 및 속성을 결정합니다. 자세한 내용은 sp_addarticle 참조하세요.

    배포 에이전트 스크립트를 적용할 때 하위 수준 구독자에 대해 검사 않습니다. 압축 복제본(replica) 선택되어 있으면 하위 수준 구독자에서 테이블을 만들지 못합니다. 혼합 토폴로지의 경우 압축의 복제본(replica) 사용하도록 설정하지 마세요.

  • 병합 복제본(replica)에서는 게시 호환성 수준이 스키마 옵션을 재정의하고 스크립팅된 스키마 개체를 결정합니다.

    혼합 토폴로지의 경우 새 압축 옵션을 지원할 필요가 없는 경우 게시 호환성 수준을 하위 수준 구독자 버전으로 설정해야 합니다. 필요한 경우 테이블을 만든 후 구독자에서 압축합니다.

다음 표에서는 복제본(replica) 동안 압축을 제어하는 복제본(replica) 설정입니다.

사용자 의도 테이블 또는 인덱스에 대한 파티션 구성표 복제 압축 설정 복제 스크립팅 동작
파티션 구성표를 복제본(replica) 파티션의 구독자에서 압축을 사용하도록 설정합니다. True True 파티션 구성표와 압축 설정을 모두 스크립팅합니다.
파티션 구성표를 복제본(replica) 구독자에서 데이터를 압축하지 않습니다. 거짓 파티션 구성표를 스크립팅하지만 파티션에 대한 압축 설정은 스크립팅하지 않습니다.
파티션 구성표를 복제본(replica) 않고 구독자의 데이터를 압축하지 않습니다. False False 파티션 또는 압축 설정을 스크립팅하지 않습니다.
게시자에서 모든 파티션이 압축된 경우 구독자에서 테이블을 압축하지만 파티션 구성표를 복제하지 않음 False True 모든 파티션에서 압축을 사용할 수 있는지 확인합니다.

테이블 수준에서 압축을 스크립션합니다.

다른 SQL Server 구성 요소에 미치는 영향

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

압축은 데이터베이스 엔진 발생하며 데이터는 압축되지 않은 상태로 SQL Server의 다른 대부분의 구성 요소에 표시됩니다. 이렇게 하면 압축이 다른 구성 요소에 미치는 영향을 다음 요소로 제한합니다.

  • 대량 가져오기 및 내보내기 작업
    • 데이터를 내보내는 경우 네이티브 형식에서도 데이터는 압축되지 않은 행 형식으로 출력됩니다. 이로 인해 내보낸 데이터 파일의 크기가 원본 데이터보다 훨씬 커질 수 있습니다.
    • 데이터를 가져올 때 대상 테이블이 압축을 사용하도록 설정된 경우 데이터베이스 엔진 데이터를 압축된 행 형식으로 변환합니다. 이로 인해 데이터를 압축되지 않은 테이블로 가져올 때보다 CPU 사용량이 증가할 수 있습니다.
    • 페이지 압축을 사용하여 데이터를 힙으로 대량으로 가져오는 경우 대량 가져오기 작업은 데이터가 삽입될 때 페이지 압축을 사용하여 데이터를 압축하려고 합니다.
  • 압축은 백업 및 복원에 영향을 주지 않습니다.
  • 압축은 로그 전달에 영향을 주지 않습니다.
  • 데이터 압축은 스파스 열과 호환되지 않습니다. 따라서 스파스 열이 포함된 테이블은 압축할 수 없으며 스파스 열을 압축된 테이블에 추가할 수도 없습니다.
  • 압축을 사용하도록 설정하면 데이터가 페이지당 다른 수의 페이지와 행 수를 사용하여 저장되므로 쿼리 계획이 변경될 수 있습니다.