행 압축 구현Row Compression Implementation

이 항목은 다음에 적용됩니다. 예SQL Server(2016부터)예Azure SQL Database아니요Azure SQL Data Warehouse아니요병렬 데이터 웨어하우스 THIS TOPIC APPLIES TO: yesSQL Server (starting with 2016)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

이 항목에서는 데이터베이스 엔진Database Engine 이 행 압축을 구현하는 방법에 대해 간략하게 설명합니다.This topic summarizes how 데이터베이스 엔진Database Engine implements row compression. 이 요약에서는 사용자의 데이터에 필요한 저장 공간을 계획하는 데 도움이 되는 기본 정보를 제공합니다.This summary provides basic information to help you plan the storage space that you need for your data.

압축이 사용하면 구문이나 의미가 아니라 데이터 형식과 연결된 데이터의 물리적 저장소 형식만 변경됩니다.Enabling compression only changes the physical storage format of the data that is associated with a data type but not its syntax or semantics. 하나 이상의 테이블에 압축이 설정될 경우 응용 프로그램을 변경할 필요는 없습니다.Application changes are not required when one or more tables are enabled for compression. 새 레코드 저장소 형식의 주요 변경 내용은 다음과 같습니다.The new record storage format has the following main changes:

  • 레코드와 연결된 메타데이터 오버헤드를 줄입니다.It reduces the metadata overhead that is associated with the record. 이 메타데이터는 열, 열의 길이 및 오프셋에 대한 정보입니다.This metadata is information about columns, their lengths and offsets. 경우에 따라 메타데이터 오버헤드는 이전 저장소 형식보다 크기가 클 수도 있습니다.In some cases, the metadata overhead might be larger than the old storage format.

  • 숫자 유형(예: integer, decimalfloat)과 숫자를 기반으로 하는 유형(예: datetimemoney)에 대해 가변 길이 저장소 형식을 사용합니다.It uses variable-length storage format for numeric types (for example integer, decimal, and float) and the types that are based on numeric (for example datetime and money).

  • 공백 문자를 저장하지 않으며 가변 길이 형식을 사용하여 고정 문자열을 저장합니다.It stores fixed character strings by using variable-length format by not storing the blank characters.

참고

모든 데이터 형식의 NULL 및 0 값은 최적화되어 바이트가 사용되지 않습니다.NULL and 0 values across all data types are optimized and take no bytes.

행 압축이 저장소에 미치는 영향How Row Compression Affects Storage

다음 표에서는 행 압축이 SQL ServerSQL ServerAzure SQL 데이터베이스Azure SQL Database의 기존 유형에 미치는 영향에 대해 설명합니다.The following table describes how row compression affects the existing types in SQL ServerSQL Server and Azure SQL 데이터베이스Azure SQL Database. 페이지 압축을 사용하여 이룰 수 있는 공간 절약에 대해서는 이 표에 포함되어 있지 않습니다.The table does not include the savings that can be achieved by using page compression.

데이터 형식Data type 저장소에 영향을 미치는지 여부Is storage affected? 설명Description
tinyinttinyint 아니요No 1바이트가 저장소에 필요한 최소 크기입니다.1 byte is the minimum storage needed.
smallintsmallint Yes 값을 1바이트로 맞추면 1바이트만 사용됩니다.If the value fits in 1 byte, only 1 byte will be used.
intint Yes 필요한 바이트만 사용합니다.Uses only the bytes that are needed. 예를 들어 값이 1바이트로 저장될 수 있다면 저장소는 1바이트만 사용합니다.For example, if a value can be stored in 1 byte, storage will take only 1 byte.
bigintbigint Yes 필요한 바이트만 사용합니다.Uses only the bytes that are needed. 예를 들어 값이 1바이트로 저장될 수 있다면 저장소는 1바이트만 사용합니다.For example, if a value can be stored in 1 byte, storage will take only 1 byte.
decimaldecimal Yes 이 저장소는 vardecimal 저장소 형식과 정확히 일치합니다.This storage is exactly same as the vardecimal storage format.
numericnumeric Yes 이 저장소는 vardecimal 저장소 형식과 정확히 일치합니다.This storage is exactly same as the vardecimal storage format.
bitbit Yes 메타데이터 오버헤드는 이것을 4비트로 가져옵니다.The metadata overhead brings this to 4 bits.
smallmoneysmallmoney Yes 4바이트 정수를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using a 4-byte integer. 통화 값에 10,000을 곱해서 소수점 이하의 자릿수를 제거하여 결과 정수 값을 저장합니다.Currency value is multiplied by 10000 and the resulting integer value is stored by removing any digits after the decimal point. 이 유형의 저장소 최적화는 정수 유형의 방식과 비슷합니다.This type has a storage optimization similar to that for integer types.
moneymoney Yes 8바이트 정수를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using an 8-byte integer. 통화 값에 10,000을 곱해서 소수점 이하의 자릿수를 제거하여 결과 정수 값을 저장합니다.Currency value is multiplied by 10000 and the resulting integer value is stored by removing any digits after the decimal point. 이 유형의 범위는 smallmoney보다 큽니다.This type has a larger range than smallmoney. 이 유형의 저장소 최적화는 정수 유형의 방식과 비슷합니다.This type has a storage optimization similar to that for integer types.
floatfloat Yes 0을 포함하여 최하위 바이트는 저장되지 않습니다.Least significant bytes with zeros are not stored. float 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.float compression is applicable mostly for nonfractional values in mantissa.
realreal Yes 0을 포함하여 최하위 바이트는 저장되지 않습니다.Least significant bytes with zeros are not stored. real 압축은 대개 가수의 소수 자릿수가 아닌 값에 적용됩니다.real compression is applicable mostly for nonfractional values in mantissa.
smalldatetimesmalldatetime 아니요No 2바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using two 2-byte integers. 데이터는 2바이트를 차지하며The date takes 2 bytes. 1901년 1월 1일 이후의 일 수 입니다.It is the number of days since 1/1/1901. 1902년부터 시작하면 2바이트가 필요하므로This needs 2 bytes starting from 1902. 해당 시점 이후에는 공간이 절약되지 않습니다.Therefore, there is no savings after that point.

시간은 자정 이후의 시간(분)입니다.The time is the number of minutes since midnight. 4AM이 약간 지난 시간 값에는 초 바이트를 사용하기 시작합니다.Time values that are slightly past 4AM start to use the second byte.

smalldatetime 이 데이터를 표현하는 데 사용되는 경우(일반적인 경우) 시간은 0.0입니다.If a smalldatetime is only used to represent a date (a common case), the time is 0.0. 압축을 통해 행 압축에 대해 최상위 바이트 형식으로 시간을 저장하여 2바이트를 절약할 수 있습니다.Compression saves 2 bytes by storing the time in most significant byte format for row compression.
datetimedatetime Yes 4바이트 정수 두 개를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using two 4-byte integers. 정수 값은 1900년 1월 1일을 기준 날짜로 사용하는 일 수를 나타냅니다.The integer value represents the number of days with base date of 1/1/1900. 처음 2바이트는 2079년까지를 나타낼 수 있습니다.The first 2 bytes can represent up to the year 2079. 따라서 그 시점까지는 압축을 통해 항상 2바이트를 절약할 수 있습니다.Compression can always save 2 bytes here until that point. 각 정수 값은 3.33밀리초를 나타냅니다.Each integer value represents 3.33 milliseconds. 처음 2바이트는 첫 5분 동안 압축으로 모두 사용되며 4PM 이후에는 네 번째 바이트가 필요합니다.Compression exhausts the first 2 bytes in first five minutes and needs the fourth byte after 4PM. 따라서 4PM 이후에는 압축을 통해 1바이트만 절약할 수 있습니다.Therefore, compression can save only 1 byte after 4PM. datetime 이 다른 정수처럼 압축되면 날짜에서 2바이트가 절약됩니다.When datetime is compressed like any other integer, compression saves 2 bytes in the date.
datedate 아니요No 3바이트를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using 3 bytes. 이는 1년 1월 1일부터의 날짜를 나타냅니다.This represents the date from 1/1/0001. 현재 날짜의 경우 행 압축은 3바이트를 모두 사용합니다.For contemporary dates, row compression uses all 3 bytes. 이 경우에는 공간이 절약되지 않습니다.This achieves no savings.
timetime 아니요No 3바이트에서 6바이트를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using 3 to 6 bytes. 3바이트에서 6바이트를 차지할 수 있는 0에서 9로 시작하는 다양한 전체 자릿수가 있습니다.There are various precisions that start with 0 to 9 that can take 3 to 6 bytes. 압축된 공간은 다음과 같이 사용됩니다.Compressed space is used as follows:

전체 자릿수 = 0. 바이트 = 3.Precision = 0. Bytes = 3. 각 정수 값은 1초를 나타냅니다.Each integer value represents a second. 압축을 통해 잠재적으로 1바이트의 공간을 절약하며 2바이트를 사용하여 6PM까지 시간을 나타낼 수 있습니다.Compression can represent time up to 6PM by using 2 bytes, potentially saving 1 byte.

전체 자릿수 = 1. 바이트 = 3.Precision = 1. Bytes = 3. 각 정수 값은 1/10초를 나타냅니다.Each integer value represents 1/10 seconds. 2AM 이전에는 세 번째 바이트가 압축에 사용됩니다.Compression uses the third byte before 2AM. 따라서 공간이 거의 절약되지 않습니다.Results in little savings.

전체 자릿수 = 2. 바이트 = 3.Precision = 2. Bytes = 3. 위의 경우와 비슷하며 공간 절약이 거의 이루어지지 않습니다.Similar to the previous case, it is unlikely to achieve savings.

전체 자릿수 = 3. 바이트 = 4.Precision = 3. Bytes = 4. 처음 3바이트가 5AM까지 사용되므로 공간이 거의 절약되지 않습니다.Because the first 3 bytes are taken by 5AM, achieves little savings.

전체 자릿수 = 4. 바이트 = 4.Precision = 4. Bytes = 4. 처음 3바이트가 첫 27초 동안 사용됩니다.The first 3 bytes are taken in the first 27 seconds. 공간 절약이 예상되지 않습니다.No savings are expected.

전체 자릿수 = 5. 바이트 = 5.Precision = 5, Bytes = 5. 정오 12시 이후 다섯 번째 바이트가 사용됩니다.Fifth byte will be used after 12-noon.

전체 자릿수 = 6 및 7. 바이트 = 5.Precision = 6 and 7, Bytes = 5. 공간이 절약되지 않습니다.Achieves no savings.

전체 자릿수 = 8. 바이트 = 6.Precision = 8, Bytes = 6. 오전 3시 이후 여섯 번째 바이트가 사용됩니다.Sixth byte will be used after 3AM.



행 압축에 대해 저장소의 변경 내용이 없습니다.Note that there is no change in storage for row compression. 전반적으로 time 데이터 형식 압축으로 공간 절약을 그다지 기대할 수 없습니다.Overall, not much savings can be expected from compressing the time data type.
datetime2datetime2 Yes 6바이트에서 9바이트를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using 6 to 9 bytes. 처음 4바이트가 날짜를 나타냅니다.The first 4 bytes represent the date. 시간이 차지하는 바이트는 지정된 시간의 전체 자릿수에 따라 달라집니다.The bytes taken by the time will depend on the precision of the time that is specified.

정수 값은 1년 1월 1일 이후부터 9999년 12월 31일까지의 일 수를 나타냅니다.The integer value represents the number of days since 1/1/0001 with an upper bound of 12/31/9999. 2005년의 날짜를 나타내려면 3바이트가 압축에 사용됩니다.To represent a date in year 2005, compression takes 3 bytes.

여러 가지 시간 전체 자릿수에 대해 2바이트에서 4바이트까지 사용할 수 있기 때문에 시간에서는 공간이 절약되지 않습니다.There is no savings on time because it allows for 2 to 4 bytes for various time precisions. 따라서 1초 시간 전체 자릿수의 경우 시간에 대해 2바이트가 압축에 사용되며 255초 후에는 두 번째 바이트가 사용됩니다.Therefore, for one-second time precision, compression uses 2 bytes for time, which takes the second byte after 255 seconds.
datetimeoffsetdatetimeoffset Yes HH:MM 형식의 2바이트 표준 시간대가 있다는 것 외에는 datetime2와 비슷합니다.Resembles datetime2, except that there are 2 bytes of time zone of the format (HH:MM).

datetime2와 같이 압축을 통해 2바이트를 절약할 수 있습니다.Like datetime2, compression can save 2 bytes.

표준 시간대 값에 대해 대부분의 경우 MM 값은 0일 수 있습니다.For time zone values, MM value might be 0 for most cases. 따라서 압축을 통해 1바이트를 절약할 수도 있습니다.Therefore, compression can possibly save 1 byte.

행 압축에 대해 저장소의 변경 내용이 없습니다.There are no changes in storage for row compression.
charchar Yes 후행 채움 문자가 제거됩니다.Trailing padding characters are removed. 데이터베이스 엔진Database Engine 에서는 사용된 데이터 정렬과 상관없이 동일한 채움 문자를 삽입합니다.Note that the 데이터베이스 엔진Database Engine inserts the same padding character regardless of the collation that is used.
varcharvarchar 아니요No 아무런 영향이 없습니다.No effect.
texttext 아니요No 아무런 영향이 없습니다.No effect.
ncharnchar Yes 후행 채움 문자가 제거됩니다.Trailing padding characters are removed. 데이터베이스 엔진Database Engine 에서는 사용된 데이터 정렬과 상관없이 동일한 채움 문자를 삽입합니다.Note that the 데이터베이스 엔진Database Engine inserts the same padding character regardless of the collation that is used.
nvarcharnvarchar 아니요No 아무런 영향이 없습니다.No effect.
ntextntext 아니요No 아무런 영향이 없습니다.No effect.
binarybinary Yes 후행 0이 제거됩니다.Trailing zeros are removed.
varbinaryvarbinary 아니요No 아무런 영향이 없습니다.No effect.
imageimage 아니요No 아무런 영향이 없습니다.No effect.
cursorcursor 아니요No 아무런 영향이 없습니다.No effect.
timestamp / rowversiontimestamp / rowversion Yes 8바이트를 사용하여 정수 데이터 표현을 사용합니다.Uses the integer data representation by using 8 bytes. 각 데이터베이스에 대해 유지 관리된 타임스탬프 카운터가 있고 이 값은 0부터 시작합니다.There is a timestamp counter that is maintained for each database, and its value starts from 0. 이것은 다른 정수 값처럼 압축될 수 있습니다.This can be compressed like any other integer value.
sql_variantsql_variant 아니요No 아무런 영향이 없습니다.No effect.
uniqueidentifieruniqueidentifier 아니요No 아무런 영향이 없습니다.No effect.
tabletable 아니요No 아무런 영향이 없습니다.No effect.
xmlxml 아니요No 아무런 영향이 없습니다.No effect.
사용자 정의 형식User-defined types 아니요No 내부적으로 varbinary처럼 나타냅니다.This is represented internally as varbinary.
FILESTREAMFILESTREAM 아니요No 내부적으로 varbinary처럼 나타냅니다.This is represented internally as varbinary.

참고 항목See Also

데이터 압축 Data Compression
페이지 압축 구현 Page Compression Implementation