행 압축 구현

이 항목에서는 데이터베이스 엔진이 행 압축을 구현하는 방법에 대해 간략하게 설명합니다. 이 요약에서는 사용자의 데이터에 필요한 저장 공간을 계획하는 데 도움이 되는 기본 정보를 제공합니다.

압축이 사용하면 구문이나 의미가 아니라 데이터 형식과 연결된 데이터의 물리적 저장소 형식만 변경됩니다. 하나 이상의 테이블에 압축이 설정될 경우 응용 프로그램을 변경할 필요는 없습니다. 새 레코드 저장소 형식의 주요 변경 내용은 다음과 같습니다.

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

  • 숫자 유형(예: integer, decimal 및 float)과 숫자를 기반으로 하는 유형(예: datetime 및 money)에 대해 가변 길이 저장소 형식을 사용합니다.

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

[!참고]

모든 데이터 형식의 NULL 및 0 값은 최적화되어 바이트가 사용되지 않습니다.

행 압축이 저장소에 미치는 영향

다음 표에서는 행 압축이 SQL Server의 기존 유형에 미치는 영향에 대해 설명합니다. 페이지 압축을 사용하여 이룰 수 있는 공간 절약에 대해서는 이 표에 포함되어 있지 않습니다.

데이터 형식

저장소에 영향을 미치는지 여부

설명

tinyint

아니요

1바이트가 저장소에 필요한 최소 크기입니다.

smallint

값을 1바이트로 맞추면 1바이트만 사용됩니다.

int

필요한 바이트만 사용합니다. 예를 들어 값이 1바이트로 저장될 수 있다면 저장소는 1바이트만 사용합니다.

bigint

필요한 바이트만 사용합니다. 예를 들어 값이 1바이트로 저장될 수 있다면 저장소는 1바이트만 사용합니다.

decimal

이 저장소는 vardecimal 저장소 형식과 정확히 일치합니다.

numeric

이 저장소는 vardecimal 저장소 형식과 정확히 일치합니다.

bit

메타데이터 오버헤드는 이것을 4비트로 가져옵니다.

smallmoney

4바이트 정수를 사용하여 정수 데이터 표현을 사용합니다. 통화 값에 10,000을 곱해서 소수점 이하의 자릿수를 제거하여 결과 정수 값을 저장합니다. 이 유형의 저장소 최적화는 정수 유형의 방식과 비슷합니다.

money

8바이트 정수를 사용하여 정수 데이터 표현을 사용합니다. 통화 값에 10,000을 곱해서 소수점 이하의 자릿수를 제거하여 결과 정수 값을 저장합니다. 이 유형의 범위는 smallmoney보다 큽니다. 이 유형의 저장소 최적화는 정수 유형의 방식과 비슷합니다.

float

0을 포함하여 최하위 바이트는 저장되지 않습니다. float 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.

real

0을 포함하여 최하위 바이트는 저장되지 않습니다. real 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.

smalldatetime

아니요

2바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용합니다. 데이터는 2바이트를 차지하며 1901년 1월 1일 이후의 일 수 입니다. 1902년부터 시작하면 2바이트가 필요하므로 해당 시점 이후에는 공간이 절약되지 않습니다.

시간은 자정 이후의 시간(분)입니다. 4AM이 약간 지난 시간 값에는 초 바이트를 사용하기 시작합니다.

smalldatetime이 데이터를 표현하는 데 사용되는 경우(일반적인 경우) 시간은 0.0입니다. 압축을 통해 행 압축에 대해 최상위 바이트 형식으로 시간을 저장하여 2바이트를 절약할 수 있습니다.

datetime

4바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용합니다. 정수 값은 1900년 1월 1일을 기준 날짜로 사용하는 일 수를 나타냅니다. 처음 2바이트는 2079년까지를 나타낼 수 있습니다. 따라서 그 시점까지는 압축을 통해 항상 2바이트를 절약할 수 있습니다. 각 정수 값은 3.33밀리초를 나타냅니다. 처음 2바이트는 첫 5분 동안 압축으로 모두 사용되며 4PM 이후에는 네 번째 바이트가 필요합니다. 따라서 4PM 이후에는 압축을 통해 1바이트만 절약할 수 있습니다. datetime이 다른 정수처럼 압축되면 날짜에서 2바이트가 절약됩니다.

date

아니요

3바이트를 사용하여 정수 데이터 표현을 사용합니다. 이는 1년 1월 1일부터의 날짜를 나타냅니다. 현재 날짜의 경우 행 압축은 3바이트를 모두 사용합니다. 이 경우에는 공간이 절약되지 않습니다.

time

아니요

3바이트에서 6바이트를 사용하여 정수 데이터 표현을 사용합니다. 3바이트에서 6바이트를 차지할 수 있는 0에서 9로 시작하는 다양한 전체 자릿수가 있습니다. 압축된 공간은 다음과 같이 사용됩니다.

  • 전체 자릿수 = 0. 바이트 = 3. 각 정수 값은 1초를 나타냅니다. 압축을 통해 잠재적으로 1바이트의 공간을 절약하며 2바이트를 사용하여 6PM까지 시간을 나타낼 수 있습니다.

  • 전체 자릿수 = 1. 바이트 = 3. 각 정수 값은 1/10초를 나타냅니다. 2AM 이전에는 세 번째 바이트가 압축에 사용됩니다. 따라서 공간이 거의 절약되지 않습니다.

  • 전체 자릿수 = 2. 바이트 = 3. 위의 경우와 비슷하며 공간 절약이 거의 이루어지지 않습니다.

  • 전체 자릿수 = 3. 바이트 = 4. 처음 3바이트가 5AM까지 사용되므로 공간이 거의 절약되지 않습니다.

  • 전체 자릿수 = 4. 바이트 = 4. 처음 3바이트가 첫 27초 동안 사용됩니다. 공간 절약이 예상되지 않습니다.

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

  • 전체 자릿수 = 6 및 7. 바이트 = 5. 공간이 절약되지 않습니다.

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

행 압축에 대해 저장소의 변경 내용이 없습니다. 전반적으로 time 데이터 형식 압축으로 공간 절약을 그다지 기대할 수 없습니다.

datetime2

6바이트에서 9바이트를 사용하여 정수 데이터 표현을 사용합니다. 처음 4바이트가 날짜를 나타냅니다. 시간이 차지하는 바이트는 지정된 시간의 전체 자릿수에 따라 달라집니다.

정수 값은 1년 1월 1일 이후부터 9999년 12월 31일까지의 일 수를 나타냅니다. 2005년의 날짜를 나타내려면 3바이트가 압축에 사용됩니다.

여러 가지 시간 전체 자릿수에 대해 2바이트에서 4바이트까지 사용할 수 있기 때문에 시간에서는 공간이 절약되지 않습니다. 따라서 1초 시간 전체 자릿수의 경우 시간에 대해 2바이트가 압축에 사용되며 255초 후에는 두 번째 바이트가 사용됩니다.

datetimeoffset

HH:MM 형식의 2바이트 표준 시간대가 있다는 것 외에는 datetime2와 비슷합니다.

datetime2와 같이 압축을 통해 2바이트를 절약할 수 있습니다.

표준 시간대 값에 대해 대부분의 경우 MM 값은 0일 수 있습니다. 따라서 압축을 통해 1바이트를 절약할 수도 있습니다.

행 압축에 대해 저장소의 변경 내용이 없습니다.

char

후행 채움 문자가 제거됩니다. 데이터베이스 엔진에서는 사용된 데이터 정렬과 상관없이 동일한 채움 문자를 삽입합니다.

varchar

아니요

아무런 영향이 없습니다.

text

아니요

아무런 영향이 없습니다.

nchar

후행 채움 문자가 제거됩니다. 데이터베이스 엔진에서는 사용된 데이터 정렬과 상관없이 동일한 채움 문자를 삽입합니다.

nvarchar

아니요

아무런 영향이 없습니다.

ntext

아니요

아무런 영향이 없습니다.

binary

후행 0이 제거됩니다.

varbinary

아니요

아무런 영향이 없습니다.

image

아니요

아무런 영향이 없습니다.

cursor

아니요

아무런 영향이 없습니다.

timestamp / rowversion

8바이트를 사용하여 정수 데이터 표현을 사용합니다. 각 데이터베이스에 대해 유지 관리된 타임스탬프 카운터가 있고 이 값은 0부터 시작합니다. 이것은 다른 정수 값처럼 압축될 수 있습니다.

sql_variant

아니요

아무런 영향이 없습니다.

uniqueidentifier

아니요

아무런 영향이 없습니다.

table

아니요

아무런 영향이 없습니다.

xml

아니요

아무런 영향이 없습니다.

사용자 정의 형식

아니요

내부적으로 varbinary처럼 나타냅니다.

FILESTREAM

아니요

내부적으로 varbinary처럼 나타냅니다.

참고 항목

개념

데이터 압축

페이지 압축 구현