このトピックでは、データベース エンジンが行圧縮を実装する方法について説明します。 この概要では、データに必要なストレージ領域を計画するのに役立つ基本情報を提供します。
圧縮を有効にすると、データ型に関連付けられているデータの物理ストレージ形式のみが変更されますが、構文やセマンティクスは変更されません。 1 つ以上のテーブルで圧縮が有効になっている場合、アプリケーションの変更は必要ありません。 新しいレコード ストレージ形式には、次の主な変更があります。
これにより、レコードに関連付けられているメタデータのオーバーヘッドが軽減されます。 このメタデータは、列、その長さ、およびオフセットに関する情報です。 場合によっては、メタデータのオーバーヘッドが古いストレージ形式よりも大きくなる場合があります。
これは、数値型 (
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 バイト整数を使用して整数データ表現を使用します。 通貨値には 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 として表されます。 |