다음을 통해 공유


행 압축 구현

적용 대상: SQL Server Azure SQL Database Azure SQL Managed Instance

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

압축이 사용 상태가 되면 데이터 형식과 연관된 데이터의 물리적 저장 형식만 변경되고 구문이나 의미 체계는 변경되지 않습니다. 하나 이상의 테이블에 압축이 설정될 경우 애플리케이션을 변경할 필요는 없습니다. 새 레코드 스토리지 형식에는 다음과 같은 주요 변경 내용이 있습니다.

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

  • 숫자 형식(예: 정수, decimal, 부동)과 숫자를 기반으로 하는 형식(예: 날짜/시간money)에 가변 길이 스토리지 형식을 사용합니다.

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

참고 항목

모든 데이터 형식에 대해 NULL0 값이 최적화되고 바이트를 사용하지 않다.

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

다음 테이블에서는 행 압축이 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이 있는 최소 중요 바이트는 저장되지 않습니다. real 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.
smalldatetime 아니요 2바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용하며 1900-01-01 이후 경과 일수입니다. smalldatetime의 날짜 부분에는 행 압축 이점이 없습니다.

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

smalldatetime이 날짜(일반적인 경우)를 나타내는 데만 사용되는 경우 시간은 0.0입니다. 압축을 통해 행 압축에 대해 최상위 바이트 형식으로 시간을 저장하여 2바이트를 절약할 수 있습니다.
날짜/시간 4바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용합니다. 정수 값은 일수이며 시작 날짜는 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바이트는 날짜를 나타냅니다. 시간별 바이트는 지정된 시간의 정밀도에 따라 달라집니다.

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

여러 가지 시간 전체 자릿수에 대해 2-4바이트까지 사용할 수 있기 때문에 시간에서는 공간이 절약되지 않습니다. 따라서 1초 시간 전체 자릿수의 경우 시간에 대해 2바이트가 압축에 사용되며 255초 후에는 두 번째 바이트가 사용됩니다.
datetimeoffset datetime2와 비슷합니다. 그 형식(HH:mm)의 2바이트 표준 시간대가 있다는 점은 다릅니다.

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 레코드는 압축되지 않은 행 외부 페이지를 사용합니다.