「マイクロソフト系技術情報 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