행 압축 구현
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
이 문서에서는 데이터베이스 엔진 행 압축을 구현하는 방법을 요약합니다. 이 요약에서는 사용자의 데이터에 필요한 스토리지 공간을 계획하는 데 도움이 되는 기본 정보를 제공합니다.
압축을 사용하도록 설정하면 데이터 형식과 연결된 데이터의 실제 스토리지 형식만 변경되지만 구문이나 의미 체계는 변경되지 않습니다. 하나 이상의 테이블을 압축할 수 있는 경우에는 애플리케이션 변경이 필요하지 않습니다. 새 레코드 스토리지 형식은 다음과 같은 기본 변경됩니다.
레코드와 연결된 메타데이터 오버헤드를 줄입니다. 이 메타데이터는 열, 해당 길이 및 오프셋에 대한 정보입니다. 경우에 따라 메타데이터 오버헤드는 이전 스토리지 형식보다 크기가 클 수도 있습니다.
숫자 형식(예: 정수, 소수점 및 부동 소수점)과 숫자를 기반으로 하는 형식(예: datetime 및 money)에 가변 길이 스토리지 형식을 사용합니다.
공백 문자를 저장하지 않으며 가변 길이 형식을 사용하여 고정 문자열을 저장합니다.
참고 항목
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 유니코드 압축은 고정 길이 nchar 및 nvarchar 데이터 형식을 지원합니다. 행 외 또는 nvarchar(max) 열에 저장된 데이터 값은 압축되지 않습니다. 유니코드 압축은 행에 저장된 경우에도 nvarchar(max) 데이터에 대해 지원되지 않습니다.
2 행이 아닌 데이터는 데이터 압축을 사용하도록 설정할 때 압축되지 않습니다. 예를 들어 8,060바이트보다 큰 XML 레코드는 압축되지 않은 행 외부 페이지를 사용합니다.
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기