행 압축 구현

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

이 문서에서는 데이터베이스 엔진 행 압축을 구현하는 방법을 요약합니다. 이 요약에서는 사용자의 데이터에 필요한 스토리지 공간을 계획하는 데 도움이 되는 기본 정보를 제공합니다.

압축을 사용하도록 설정하면 데이터 형식과 연결된 데이터의 실제 스토리지 형식만 변경되지만 구문이나 의미 체계는 변경되지 않습니다. 하나 이상의 테이블을 압축할 수 있는 경우에는 애플리케이션 변경이 필요하지 않습니다. 새 레코드 스토리지 형식은 다음과 같은 기본 변경됩니다.

  • 레코드와 연결된 메타데이터 오버헤드를 줄입니다. 이 메타데이터는 열, 해당 길이 및 오프셋에 대한 정보입니다. 경우에 따라 메타데이터 오버헤드는 이전 스토리지 형식보다 크기가 클 수도 있습니다.

  • 숫자 형식(예: 정수, 소수점 및 부동 소수점)과 숫자를 기반으로 하는 형식(예: datetimemoney)에 가변 길이 스토리지 형식을 사용합니다.

  • 공백 문자를 저장하지 않으며 가변 길이 형식을 사용하여 고정 문자열을 저장합니다.

참고 항목

NULL 모든 0 데이터 형식의 값이 최적화되고 바이트를 사용하지 않습니다.

행 압축이 스토리지에 미치는 영향

다음 표에서는 행 압축이 SQL Server 및 Azure SQL Database의 기존 형식에 미치는 영향을 설명합니다. 표에는 페이지 압축을 사용하여 달성할 수 있는 절감액이 포함되지 않습니다.

데이터 형식 스토리지에 영향을 주나요? 설명
tinyint 아니요 1 바이트는 필요한 최소 스토리지입니다.
smallint 값이 1 바이트에 맞으면 1 바이트만 사용됩니다.
int 필요한 바이트만 사용합니다. 예를 들어 값을 1 바이트에 저장할 수 있는 경우 스토리지는 1 바이트만 사용합니다.
bigint 필요한 바이트만 사용합니다. 예를 들어 값을 1 바이트에 저장할 수 있는 경우 스토리지는 1 바이트만 사용합니다.
decimal 지정된 정밀도에 관계없이 필요한 바이트만 사용합니다. 예를 들어 값을 3바이트 단위로 저장할 수 있는 경우 스토리지는 3바이트만 사용합니다. 스토리지 공간은 vardecimal 스토리지 형식과 정확히 동일합니다.
numeric 지정된 정밀도에 관계없이 필요한 바이트만 사용합니다. 예를 들어 값을 3바이트 단위로 저장할 수 있는 경우 스토리지는 3바이트만 사용합니다. 스토리지 공간은 vardecimal 스토리지 형식과 정확히 동일합니다.
bit 메타데이터 오버헤드는 이를 4비트로 가져옵니다.
smallmoney 4 바이트 정수로 정수 데이터 표현을 사용합니다. 통화 값은 10,000을 곱하고 결과 정수 값은 소수점 뒤의 숫자를 제거하여 저장됩니다. 이 형식에는 정수 형식과 유사한 스토리지 최적화가 있습니다.
money 8 바이트 정수로 정수 데이터 표현을 사용합니다. 통화 값은 10,000을 곱하고 결과 정수 값은 소수점 뒤의 숫자를 제거하여 저장됩니다. 이 형식은 smallmoney보다 큰 범위를 가립니다. 이 형식에는 정수 형식과 유사한 스토리지 최적화가 있습니다.
float 0이 있는 최소 중요 바이트는 저장되지 않습니다. float 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.
real 0이 있는 최소 중요 바이트는 저장되지 않습니다. 실제 압축은 주로 가수의 비구상 값에 적용됩니다.
smalldatetime 아니요 두 개의 2 바이트 정수를 사용하여 정수 데이터 표현을 사용하며 이후의 일 1900-01-01수입니다. smalldatetime의 날짜 부분에는 행 압축 이점이 없습니다.

시간은 자정 이후의 시간(분)입니다. 오전 4시 약간 지난 시간 값은 두 번째 바이트를 사용하기 시작합니다.

smalldatetime날짜(일반적인 경우)를 나타내는 데만 사용되는 경우 시간은 .입니다0.0. 압축을 통해 행 압축에 대해 최상위 바이트 형식으로 시간을 저장하여 2바이트를 절약할 수 있습니다.
날짜/시간 두 개의 4 바이트 정수로 정수 데이터 표현을 사용합니다. 정수 값은 기본 날짜가 1일인 일 1900-01-01수를 나타냅니다. 처음 2바이트는 최대 연도 2079를 나타낼 수 있습니다. 압축은 해당 시점까지 항상 여기에 2바이트를 저장할 수 있습니다. 각 정수 값은 3.33밀리초를 나타냅니다. 처음 2바이트는 첫 5분 동안 압축으로 모두 사용되며 4PM 이후에는 네 번째 바이트가 필요합니다. 따라서 압축은 오후 4시 이후에 1바이트만 저장할 수 있습니다. datetime 이 다른 정수처럼 압축되면 날짜에서 2바이트가 절약됩니다.
date 아니요 3바이트를 사용하여 정수 데이터 표현을 사용합니다. 이 값은 .의 날짜를 0001-01-01나타냅니다. 현재 날짜의 경우 행 압축은 3바이트를 모두 사용합니다. 이렇게 하면 비용을 절감할 수 없습니다.
time 아니요 3-6바이트를 사용하여 정수 데이터 표현을 사용합니다. 3-6바이트가 걸릴 수 있는 0~9로 시작하는 다양한 정밀도가 있습니다. 압축된 공간은 다음과 같이 사용됩니다.

전체 자릿수 = 0. 바이트 = 3. 각 정수 값은 1초를 나타냅니다. 압축은 2바이트를 사용하여 오후 6시까지 시간을 나타낼 수 있으며 1바이트를 절약할 수 있습니다.

전체 자릿수 = 1. 바이트 = 3. 각 정수 값은 1/10초를 나타냅니다. 압축은 오전 2시 이전에 세 번째 바이트를 사용합니다. 그 결과 절감액이 거의 없습니다.

전체 자릿수 = 2. 바이트 = 3. 이전 사례와 마찬가지로 절감액을 달성할 가능성은 거의 없습니다.

전체 자릿수 = 3. 바이트 = 4. 처음 3바이트는 오전 5시까지 사용되므로 이 옵션은 거의 절감되지 않습니다.

전체 자릿수 = 4. 바이트 = 4. 처음 3바이트가 첫 27초 동안 사용됩니다. 절감액은 필요하지 않습니다.

전체 자릿수 = 5, 바이트 = 5. 다섯 번째 바이트는 정오 12시 이후에 사용됩니다.

전체 자릿수 = 6 및 7, 바이트 = 5. 비용 절감을 달성하지 않습니다.

전체 자릿수 = 8, 바이트 = 6. 여섯 번째 바이트는 오전 3시 이후에 사용됩니다.

행 압축을 위한 스토리지에는 변경 사항이 없습니다. 전반적으로 시간 데이터 형식을 압축하면 많은 비용을 절감할 수 없습니다.
datetime2 6-9바이트를 사용하여 정수 데이터 표현을 사용합니다. 처음 4바이트는 날짜를 나타냅니다. 시간별 바이트는 지정된 시간의 정밀도에 따라 달라집니다.

정수 값은 상한이 12/31/9999인 이후 0001-01-01 의 일 수를 나타냅니다. 2005년의 날짜를 나타내기 위해 압축에는 3바이트가 소요됩니다.

다양한 시간 정밀도에 대해 2-4바이트를 허용하므로 시간이 절약되지 않습니다. 따라서 1초 시간 전체 자릿수의 경우 시간에 대해 2바이트가 압축에 사용되며 255초 후에는 두 번째 바이트가 사용됩니다.
datetimeoffset 형식(HH:mm)의 표준 시간대가 2바이트라는 점을 제외하고 datetime2와 유사합니다.

datetime2와 마찬가지로 압축은 2바이트를 절약할 수 있습니다.

표준 시간대 값의 경우 값은 mm 대부분의 경우일 0 수 있습니다. 따라서 압축은 1바이트까지 저장할 수 있습니다.

행 압축을 위해 스토리지에 변경 내용이 없습니다.
char 후행 안쪽 여백 문자가 제거됩니다. 데이터베이스 엔진 사용되는 데이터 정렬에 관계없이 동일한 안쪽 여백 문자를 삽입합니다.
varchar 아니요 아무런 영향이 없습니다.
text 아니요 아무런 영향이 없습니다.
nchar 1 후행 안쪽 여백 문자가 제거됩니다. 데이터베이스 엔진 사용되는 데이터 정렬에 관계없이 동일한 안쪽 여백 문자를 삽입합니다.
nvarchar 아니요 1 아무런 영향이 없습니다.
ntext 아니요 아무런 영향이 없습니다.
binary 후행 0이 제거됩니다.
varbinary 아니요 아무런 영향이 없습니다.
image 아니요 아무런 영향이 없습니다.
cursor 아니요 아무런 영향이 없습니다.
timestamp / rowversion 8바이트를 사용하여 정수 데이터 표현을 사용합니다. 각 데이터베이스에 대해 기본 타임스탬프 카운터가 있으며 해당 값은 0부터 시작합니다. 이것은 다른 정수 값처럼 압축될 수 있습니다.
sql_variant 아니요 아무런 영향이 없습니다.
uniqueidentifier 아니요 아무런 영향이 없습니다.
table 아니요 아무런 영향이 없습니다.
xml 아니요 2 아무런 영향이 없습니다.
사용자 정의 형식 아니요 내부적으로 varbinary처럼 나타냅니다.
FILESTREAM 아니요 내부적으로 varbinary처럼 나타냅니다.

1 유니코드 압축은 고정 길이 ncharnvarchar 데이터 형식을 지원합니다. 행 외 또는 nvarchar(max) 열에 저장된 데이터 값은 압축되지 않습니다. 유니코드 압축은 행에 저장된 경우에도 nvarchar(max) 데이터에 대해 지원되지 않습니다.

2 행이 아닌 데이터는 데이터 압축을 사용하도록 설정할 때 압축되지 않습니다. 예를 들어 8,060바이트보다 큰 XML 레코드는 압축되지 않은 행 외부 페이지를 사용합니다.