「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次  †
概要  †
SQL Server は、2008から、
- テーブルとインデックスの両方で
 
- 「データ圧縮」(行とページの圧縮)
 
をサポートしている。
なお、「データ圧縮」は、
- SQL Server 2008のEnterprise EditionおよびDeveloper Editionでのみ使用でき、
 
- SQL Server Management Studioの「データ圧縮ウィザード」でもサポートされる。
 
圧縮対象  †
クラスタ化インデックス  †
非クラスタ化インデックスのヒープ  †
非クラスタ化インデックス  †
インデックス付きビュー  †
「パーティション分割」されているテーブルとインデックス。
※ この場合、「パーティション」毎に、別々の圧縮オプションを指定できる。
パーティション テーブル  †
パーティション インデックス  †
行圧縮とページ圧縮  †
行圧縮  †
行圧縮は、
SQL Server 2005 SP2以降で提供されたvardecimalデータ型と同じような動作
(固定長データ型の利用していない領域を削り、可変長データ型のように扱う)
で、圧縮を行う。
ページ圧縮  †
圧縮方法  †
- プレフィックス圧縮
- このプレフィックスは、=列値の先頭から一致するデータパターン。
 
- 列毎に、プレフィックスがページのヘッダに移動される。
 
- 列の値は、プレフィックス参照に変更される。
 
 
- ディクショナリ圧縮
- このディクショナリは、=列値と完全に一致する値のリスト。
 
- プレフィックス圧縮の完了後、ディクショナリ圧縮が適用される。
 
- ディクショナリ圧縮は、1つの列に制限されない。
ページ上の任意の場所を対象とすることができる。 
 
ページと圧縮の方法  †
注意事項  †
必要なリソース  †
実行時  †
- CPUリソースを消費して、I/Oコストを下げるというもの。
- CPUコスト: 圧縮・解凍のオーバヘッド
 
- ストレージ コスト: I/Oとサイズの双方
 
 
- 従って、何を圧縮すべきかどうかを検討する必要がある。
 
圧縮時  †
- 圧縮には、インデックス再構築の実行と同等の、ディスクの空き容量が必要になる。
 
- オンラインのテーブル(非クラスタ化インデックスのヒープ)の圧縮はシングル スレッドである。
 
適用先  †
テーブル・インデックス  †
- システム テーブルには適用されない。
 
- 「クラスタ化インデックス」には、自動的に反映される。
 
- 「非クラスタ化インデックス」には、自動的には反映されない。
 
サイズ  †
- 圧縮をしても、テーブルやインデックスの最大行サイズは変更されない。
 
- 最大行サイズが8,060バイトを超える場合、テーブルに圧縮を適用できない。
 
- サイズが原因で特殊なページに格納されたLOBデータは圧縮を適用できない。
 
運用時の考慮点  †
- テーブル(非クラスタ化インデックスのヒープ)の圧縮設定を変更する場合、
「非クラスタ化インデックス」を再構築して、行識別子ポインタを変更する必要がある。 
ページ圧縮のトリガ  †
- ページ圧縮は、ページがいっぱいになった状態で、
(INSERT INTO、BULK INSERTを使用して、)
行追加することによって開始される。 
- 以降の行追加に対しては、基本的にページ圧縮が適用される。
 
- 既存のテーブルに適用する場合は、直ちに各ページが評価・再構築される。
 
圧縮の推定、代替  †
- 圧縮による削減量の推定には、sp_estimate_data_compression_savings ストアドを使用できる。
 
- データの断片化が進んでいる場合は、インデックス再構築でもサイズ縮小できる可能性がある。
 
SQL Serverコンポーネントへの影響  †
- 影響の無いもの
- バックアップ・リストア()
 
- ログ配布(トランザクション・ログのため)
 
 
- 影響の有るもの
- クエリ プラン
ページ数とページあたりの行数が異なるためクエリ プランの変更を伴う。 
 
- 一括インポート操作と一括エクスポート操作
エクスポート時は、非圧縮のデータとなるため、操作に圧縮・解凍が伴う。 
- レプリケーション
以下のレプリケーションの範囲に従って作成するスクリプトを変更する。
- テーブルまたはインデックスのパーティション構成をレプリケートする。
パーティション構成のスクリプトを作成する。 
- 圧縮設定のレプリケートする。
圧縮設定のスクリプトを作成する。 
 
データ圧縮とパーティション  †
「パーティション分割」と「データ圧縮」の併用によって、
必要な「パーティション」のみ「データ圧縮」するよう選択できる。
圧縮対象のパーティション  †
下記のような「パーティション」は、
「データ圧縮」しない(若しくは行圧縮のみ適用)。
- 頻繁にアクセスする「パーティション」
 
- データの変更が頻繁に発生する「パーティション」
 
圧縮対象でないパーティション  †
下記のような「パーティション」は、
「データ圧縮」する(ページ圧縮を適用)。
- あまりアクセスしない「パーティション」
 
- 確定している過去データの読み取り専用「パーティション」
 
圧縮時の注意点  †
「パーティション」を「データ圧縮」する場合は、以下の点に注意する。
既存の「パーティション」の分割  †
元の「パーティション」のデータ圧縮属性が、
分割後の双方の「パーティション」に継承される。
既存の「パーティション」のマージ  †
マージ先「パーティション」のデータ圧縮属性が、
得られる「パーティション」に継承される。
既存の「パーティション」の切替え  †
「パーティション」のデータ圧縮属性が、
テーブルのデータ圧縮属性と一致する必要がある。
変更時の考慮点  †
パーティション or テーブル全体  †
既存の「パーティション テーブル」・「パーティション インデックス」の
圧縮設定の変更( = 再構築)に使用できる構文には、次の2つの構文が利用できる。
クラスタ化インデックスの削除  †
- オフライン で「パーティション分割」された「クラスタ化インデックス」を削除した場合、
- 「クラスタ化インデックス」の上位レベルだけが削除されるため、操作は高速だが、
「パーティション構成」を変更しない限り、ヒープ上のデータ圧縮属性が維持される。 
- これは、「パーティション構成」を変更するか、明示的に
ALTER TABLE ... REBUILD ... ステートメントを実行、再構築することにより解除できる。 
 
- なお、オンラインで「パーティション分割」された「クラスタ化インデックス」を削除した場合、
- SQL Server によって、自動的に再構築され、データ圧縮属性が解除される。
 
 
圧縮の効果  †
参考  †
Tags: :データアクセス, :SQL Server