NVARCHAR (MAX)를 압축하는 다른 방법?


14

NVARCHAR(MAX)필드 가있는 일부 테이블을 압축하려고 합니다. 불행히도 rowpage압축은 원하는 영향을 미치지 않습니다 (20GB 테이블에 ~ 100 / 200MB 만 저장 됨). 또한 열 저장소 및 열 저장소 보관 압축은 NVARCHAR(MAX)필드 압축을 지원하지 않기 때문에 적용 할 수 없습니다 .

아무도 내가 대안이 있는지 말할 수 있습니까?

또한 열의 내용 이 고유 하기 때문에 rowpage압축이 효과가 없다고 생각합니다 NVARCHAR(MAX).


2
열 값이 8000 자보다 넓습니까? 예를 들어 SELECT MAX (CAST (LEN (widecolumn) AS BIGINT)) FROM dbo.largeTable 그렇지 않으면 일반 varchar로 변환하고 클러스터 된 columnstore를 적용 할 수 있습니다.
wBob

@wBob 가장 ​​큰 값이 2000자인 경우에도 VARCHAR둘 이상의 코드 페이지의 문자를 사용하는 경우 데이터 손실이 발생할 가능성이 있습니까? NVARCHAR(4000)최대 길이가 4000을 넘지 않으면 로 변환해야한다고 생각합니다. 모든 값이 전체 유니 코드 압축에 적합하기 때문입니다. 여전히 질문의 정보에서 값이 4000자를 초과한다고 가정하는 것이 안전하므로 현재 압축되지 않는 이유입니다.
Solomon Rutzky

답변:


16

페이지 및 행 압축 모두 BLOB를 압축 하지 않습니다 .

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

BLOB를 압축하려면이를 BLOB으로 저장하고 VARBINARY(MAX)선택한 스트림 압축 알고리즘을 적용해야합니다. 예를 들면 GZipStream. 이를 수행하는 방법에는 여러 가지 예가 있습니다. GZipStream 및 SQLCLR 만 검색하면됩니다.


10

사용자 지정 압축을 수행하는 방법에는 현재 두 가지가 있습니다.

  1. SQL Server 2016부터 COMPRESSDECOMPRESS에 대한 기본 제공 기능이 있습니다. 이 함수는 GZip 알고리즘을 사용합니다.

  2. SQLCLR을 사용하여 선택한 알고리즘을 구현하십시오 (그의 답변에서 언급 된 @Remus). 이 옵션은 SQL Server 2016 이전 버전에서 사용할 수 있으며 SQL Server 2005로 거슬러 올라갑니다.

    GZip은 .NET 지원되는 .NET Framework 라이브러리 (코드는 SAFE어셈블리에 있을 수 있음)에서 사용할 수 있으므로 쉽게 선택할 수 있습니다 . 또는 GZip을 원하지만 코딩 / 배포를 처리하지 않으려 는 경우 무료 버전의 SQL # SQLCLR 라이브러리 (저는 필자) 에서 사용할 수 있는 Util_GZipUtil_GUnzip 함수를 사용할 수 있습니다 .

    직접 코딩하든 SQL #을 사용하든 GZip을 사용하기로 결정한 경우 .NET에서 GZip 압축을 수행하는 데 사용되는 알고리즘이 Framework 버전 4.5에서 더 잘 변경되었습니다 (MSDN의 "설명"섹션 참조). GZipStream 클래스 페이지 ). 이것은 다음을 의미합니다.

    1. 프레임 워크 버전 2.0, 3.0 및 3.5를 처리하는 CLR v 2.0에 연결된 SQL Server 2005, 2008 또는 2008 R2를 사용하는 경우 프레임 워크 버전 4.5의 변경 사항이 적용되지 않으며 불행히도 .NET의 독창적 인 알고리즘.
    2. Framework 버전 4.0, 4.5.x, 4.6을 처리하는 CLR v 4.0에 연결된 SQL Server 2012 이상 (지금까지 2014 및 2016)을 사용하는 경우 더 새롭고 더 나은 알고리즘을 사용할 수 있습니다. 유일한 요구 사항은 SQL Server를 실행하는 서버에서 .NET Framework를 버전 4.5 이상으로 업데이트 한 것입니다.

    그러나 GZip을 사용할 필요는 없으며 알고리즘을 자유롭게 구현할 수 있습니다.

참고 : 위에서 언급 한 모든 방법은 기술적으로 "NVARCHAR (MAX) 데이터를 압축하는 대체 방법"임에도 불구하고 실제 대체 방법이 아니라 "해결 방법"입니다. 차이점은 데이터 압축 내장과 함께 - rowpage- SQL Server에서 제공되는 압축 막후 처리하고 데이터가 여전히 사용 가능한 읽을 수 및 색인입니다. 그러나 데이터를 압축하면 VARBINARY공간을 절약하면서 기능을 포기할 수 있습니다. 사실, 20k 문자열은 어쨌든 인덱싱 할 수 없지만 여전히WHERE절 또는 문자열 함수 사용자 정의 압축 값으로 작업을 수행하려면 압축을 풀어야합니다. 이진 파일 (PDF, JPEG 등)을 압축 할 때 이것은 문제가되지 않지만이 질문은 NVARCHAR데이터 에만 해당됩니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.