次の方法で共有


行圧縮の実装

このトピックでは、データベース エンジンが行圧縮を実装する方法について説明します。 この概要では、データに必要なストレージ領域を計画するのに役立つ基本情報を提供します。

圧縮を有効にすると、データ型に関連付けられているデータの物理ストレージ形式のみが変更されますが、構文やセマンティクスは変更されません。 1 つ以上のテーブルで圧縮が有効になっている場合、アプリケーションの変更は必要ありません。 新しいレコード ストレージ形式には、次の主な変更があります。

  • これにより、レコードに関連付けられているメタデータのオーバーヘッドが軽減されます。 このメタデータは、列、その長さ、およびオフセットに関する情報です。 場合によっては、メタデータのオーバーヘッドが古いストレージ形式よりも大きくなる場合があります。

  • これは、数値型 ( integerdecimalfloatなど) と数値に基づく型 ( datetimemoneyなど) に可変長ストレージ形式を使用します。

  • 空白文字を格納しないことで、可変長形式を使用して固定文字列を格納します。

すべてのデータ型で NULL 値と 0 個の値が最適化され、バイトは使用されません。

行圧縮がストレージに与える影響

次の表では、行の圧縮が SQL Server の既存の型に与える影響について説明します。 このテーブルには、ページ圧縮を使用して実現できる節約は含まれません。

データの種類 ストレージは影響を受けるか 説明
tinyint いいえ 1 バイトは、必要な最小ストレージです。
smallint イエス 値が 1 バイトに収まる場合は、1 バイトのみが使用されます。
int イエス 必要なバイトのみを使用します。 たとえば、値を 1 バイトで格納できる場合、ストレージには 1 バイトしかかからなくなります。
bigint イエス 必要なバイトのみを使用します。 たとえば、値を 1 バイトで格納できる場合、ストレージには 1 バイトしかかからなくなります。
decimal イエス このストレージは、vardecimal ストレージ形式とまったく同じです。
numeric イエス このストレージは、vardecimal ストレージ形式とまったく同じです。
bit イエス メタデータのオーバーヘッドにより、これは 4 ビットになります。
smallmoney イエス 4 バイト整数を使用して整数データ表現を使用します。 通貨値には 10000 が乗算され、結果の整数値は小数点の後の数字を削除して格納されます。 この型には、整数型の場合と同様のストレージ最適化があります。
money イエス 8 バイト整数を使用して整数データ表現を使用します。 通貨値には 10000 が乗算され、結果の整数値は小数点の後の数字を削除して格納されます。 この型の範囲は、 smallmoneyよりも大きくなります。 この型には、整数型の場合と同様のストレージ最適化があります。
float イエス ゼロを持つ最下位バイトは格納されません。 float 圧縮は、ほとんどの場合、仮数の非小数値に適用されます。
real イエス ゼロを持つ最下位バイトは格納されません。 real 圧縮は、仮数の非小数値にほとんどの場合適用されます。
smalldatetime いいえ 2 つの 2 バイト整数を使用して整数データ表現を使用します。 日付は 2 バイトです。 これは、1901 年 1 月 1 日以降の日数です。 これには、1902 から 2 バイトが必要です。 したがって、その後の節約はありません。

時刻は、午前 0 時からの分数です。 午前 4 時をわずかに過ぎた時刻の値は、2 番目のバイトの使用を開始します。

smalldatetimeが日付を表すためにのみ使用される場合 (一般的なケース)、時刻は 0.0 です。 圧縮では、行圧縮の最も重要なバイト形式で時刻を格納することで、2 バイトを節約できます。
datetime イエス 2 つの 4 バイト整数を使用して整数データ表現を使用します。 整数値は、基準日が 1/1/1900 の日数を表します。 最初の 2 バイトは、2079 年まで表すことができます。 圧縮では、その時点まで常に 2 バイトを保存できます。 各整数値は 3.33 ミリ秒を表します。 圧縮では、最初の 5 分で最初の 2 バイトが使い果たされ、午後 4 時以降に 4 バイト目が必要になります。 そのため、圧縮は午後 4 時以降に 1 バイトしか保存できません。 datetimeが他の整数と同様に圧縮されると、圧縮によって日付に 2 バイトが保存されます。
date いいえ 3 バイトを使用して整数データ表現を使用します。 これは、1/1/0001 からの日付を表します。 現代的な日付の場合、行圧縮では 3 バイトすべてが使用されます。 これにより、節約は実現されません。
time いいえ 3 ~ 6 バイトを使用して整数データ表現を使用します。 0 から 9 で始まるさまざまな有効桁数があり、3 から 6 バイトかかる場合があります。 行圧縮用のストレージには変更がないことに注意してください。 全体として、 time データ型の圧縮による節約はあまり期待できません。 圧縮領域は次のように使用されます。

精度 = 0。 バイト数 = 3。 各整数値は 1 秒を表します。 圧縮は、2 バイトを使用して午後 6 時までの時間を表すことができるので、1 バイトを節約できる可能性があります。

精度 = 1。 バイト数 = 3。 各整数値は 1/10 秒を表します。 圧縮では、午前 2 時より前の 3 番目のバイトが使用されます。 節約効果はほとんどありません。

精度 = 2。 バイト数 = 3。 前のケースと同様に、節約を実現する可能性は低いです。

精度 = 3。 バイト数 = 4。 最初の 3 バイトは午前 5 時に取得されるため、ほとんど節約されません。

精度 = 4。 バイト数 = 4。 最初の 3 バイトは、最初の 27 秒で取得されます。 節約は期待されません。

有効桁数 = 5、バイト数 = 5。 5 番目のバイトは、12-noon の後に使用されます。

有効桁数 = 6 および 7、バイト数 = 5。 節約を実現しません。

有効桁数 = 8、バイト数 = 6。 6 番目のバイトは、午前 3 時以降に使用されます。
datetime2 イエス 6 ~ 9 バイトを使用して整数データ表現を使用します。 最初の 4 バイトは日付を表します。 時刻の精度によって、使用されるバイト数が異なります。

整数値は、1/1/0001 以降の日数を表し、上限は 12/31/9999 です。 2005 年の日付を表すには、圧縮に 3 バイトかかります。

さまざまな時間精度で 2 ~ 4 バイトが可能なため、時間の節約は行われません。 したがって、1秒の時間精度の場合、圧縮では時間に対して2バイトが使用され、255秒に達した後に2バイト目が使用されます。
datetimeoffset イエス 形式のタイム ゾーンが 2 バイト (HH:MM) であることを除き、 datetime2に似ています。

datetime2と同様に、圧縮によって 2 バイトを節約できます。

タイム ゾーン値の場合、ほとんどの場合、MM 値は 0 になることがあります。 そのため、圧縮によって 1 バイトを節約できる可能性があります。

行の圧縮のためにストレージに変更はありません。
char イエス 末尾のパディング文字が削除されます。 データベース エンジンは、使用されている照合順序に関係なく、同じ埋め込み文字を挿入します。
varchar いいえ 影響しません。
text いいえ 影響しません。
nchar イエス 末尾のパディング文字が削除されます。 データベース エンジンは、使用されている照合順序に関係なく、同じ埋め込み文字を挿入します。
nvarchar いいえ 影響しません。
ntext いいえ 影響しません。
binary イエス 末尾のゼロは削除されます。
varbinary いいえ 影響しません。
image いいえ 影響しません。
cursor いいえ 影響しません。
timestamp / rowversion イエス 8 バイトを使用して整数データ表現を使用します。 データベースごとに保持されるタイムスタンプ カウンターがあり、その値は 0 から始まります。 これは、他の整数値と同様に圧縮できます。
sql_variant いいえ 影響しません。
uniqueidentifier いいえ 影響しません。
table いいえ 影響しません。
xml いいえ 影響しません。
ユーザー定義型 いいえ これは内部的に varbinaryとして表されます。
FILESTREAM いいえ これは内部的に varbinaryとして表されます。

こちらもご覧ください

データの圧縮
ページ圧縮の実装