행 압축 구현
이 항목에서는 데이터베이스 엔진이 행 압축을 구현하는 방법에 대해 간략하게 설명합니다. 이 요약에서는 사용자의 데이터에 필요한 저장 공간을 계획하는 데 도움이 되는 기본 정보를 제공합니다.
압축이 사용하면 구문이나 의미가 아니라 데이터 형식과 연결된 데이터의 물리적 저장소 형식만 변경됩니다. 하나 이상의 테이블에 압축이 설정될 경우 응용 프로그램을 변경할 필요는 없습니다. 새 레코드 저장소 형식의 주요 변경 내용은 다음과 같습니다.
레코드와 연결된 메타데이터 오버헤드를 줄입니다. 이 메타데이터는 열, 열의 길이 및 오프셋에 대한 정보입니다. 경우에 따라 메타데이터 오버헤드는 이전 저장소 형식보다 크기가 클 수도 있습니다.
숫자 유형(예: 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로 시작하는 다양한 전체 자릿수가 있습니다. 압축된 공간은 다음과 같이 사용됩니다.
행 압축에 대해 저장소의 변경 내용이 없습니다. 전반적으로 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처럼 나타냅니다. |