「行の圧縮の実装」Row Compression Implementation

適用対象: ○SQL Server ○Azure SQL Database XAzure SQL Data Warehouse XParallel Data WarehouseAPPLIES TO: yesSQL Server yesAzure SQL Database noAzure 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. 1 つ以上のテーブルで圧縮を有効にしても、アプリケーションの変更は必要ありません。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.

  • 数値型 ( integerdecimalfloatなど) および数値に基づく型 ( 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 Server および Azure 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 つの 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.

時刻は、午前 0 時から経過した分数です。The time is the number of minutes since midnight. 午前 4 時を少し過ぎた時点から、時刻の値に 2 番目のバイトが使用されます。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 2 つの 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. 圧縮により、最初の 5 分で最初の 2 バイトが使用され、午後 4 時を過ぎると 4 番目のバイトが必要になります。Compression exhausts the first 2 bytes in first five minutes and needs the fourth byte after 4PM. したがって、午後 4 時を過ぎると、圧縮しても 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、バイト数 = 3Precision = 0. Bytes = 3. 各整数値は 1 秒を表します。Each integer value represents a second. 圧縮により、2 バイトを使用して午後 6 時までを表し、1 バイト節約できる可能性があります。Compression can represent time up to 6PM by using 2 bytes, potentially saving 1 byte.

有効桁数 = 1、バイト数 = 3Precision = 1. Bytes = 3. 各整数値は 1/10 秒を表します。Each integer value represents 1/10 seconds. 圧縮では、午前 2 時の前に 3 番目のバイトを使用します。Compression uses the third byte before 2AM. その結果、ほとんど節約されません。Results in little savings.

有効桁数 = 2、バイト数 = 3Precision = 2. Bytes = 3. 上記の場合と同様に、節約できる可能性はほとんどありません。Similar to the previous case, it is unlikely to achieve savings.

有効桁数 = 3、バイト数 = 4Precision = 3. Bytes = 4. 最初の 3 バイトが午前 5 時までに使用されるため、ほとんど節約できません。Because the first 3 bytes are taken by 5AM, achieves little savings.

有効桁数 = 4、バイト数 = 4Precision = 4. Bytes = 4. 最初の 3 バイトが最初の 27 秒で使用されます。The first 3 bytes are taken in the first 27 seconds. 節約される見込みはありません。No savings are expected.

有効桁数 = 5、バイト数 = 5Precision = 5, Bytes = 5. 5 番目のバイトが正午以降に使用されます。Fifth byte will be used after 12-noon.

有効桁数 = 6 および 7、バイト数 = 5Precision = 6 and 7, Bytes = 5. 節約は実現しません。Achieves no savings.

有効桁数 = 8、バイト数 = 6Precision = 8, Bytes = 6. 午前 3 時を過ぎると、6 番目のバイトが使用されます。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 秒を過ぎると 2 番目のバイトが使用されます)。Therefore, for one-second time precision, compression uses 2 bytes for time, which takes the second byte after 255 seconds.
datetimeoffsetdatetimeoffset はいYes 2 バイトのタイム ゾーンの形式 (HH:MM) があることを除いて、 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.
カーソル (cursor)cursor いいえ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.
テーブルtable いいえ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