マイクロソフト系技術情報 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とサイズの双方
  • 従って、何を圧縮すべきかどうかを検討する必要がある。
  • 参考
    • 第7回 大規模データ処理におけるCPUとI/Oのバランスをどう考えるか:
      RDBMSでも大規模データをあきらめないためには|gihyo.jp … 技術評論社
      http://gihyo.jp/admin/serial/01/rdbms/0007

圧縮時

  • 圧縮には、インデックス再構築の実行と同等の、ディスクの空き容量が必要になる。
  • オンラインのテーブル(非クラスタ化インデックスのヒープ)の圧縮はシングル スレッドである。

適用先

テーブル・インデックス

  • システム テーブルには適用されない。
  • 「クラスタ化インデックス」には、自動的に反映される。
  • 「非クラスタ化インデックス」には、自動的には反映されない。

サイズ

  • 圧縮をしても、テーブルやインデックスの最大行サイズは変更されない。
  • 最大行サイズが8,060バイトを超える場合、テーブルに圧縮を適用できない。
  • サイズが原因で特殊なページに格納されたLOBデータは圧縮を適用できない。

運用時の考慮点

  • テーブル(非クラスタ化インデックスのヒープ)の圧縮設定を変更する場合、
    「非クラスタ化インデックス」を再構築して、行識別子ポインタを変更する必要がある。

ページ圧縮のトリガ

  • ページ圧縮は、ページがいっぱいになった状態で、
    (INSERT INTO、BULK INSERTを使用して、)
    行追加することによって開始される。
  • 以降の行追加に対しては、基本的にページ圧縮が適用される。
  • 既存のテーブルに適用する場合は、直ちに各ページが評価・再構築される。

圧縮の推定、代替

  • 圧縮による削減量の推定には、sp_estimate_data_compression_savings ストアドを使用できる。
  • データの断片化が進んでいる場合は、インデックス再構築でもサイズ縮小できる可能性がある。

SQL Serverコンポーネントへの影響

  • 影響の無いもの
    • バックアップ・リストア()
    • ログ配布(トランザクション・ログのため)
  • 影響の有るもの
    • クエリ プラン
      ページ数とページあたりの行数が異なるためクエリ プランの変更を伴う。
  • 一括インポート操作と一括エクスポート操作
    エクスポート時は、非圧縮のデータとなるため、操作に圧縮・解凍が伴う。
  • レプリケーション
    以下のレプリケーションの範囲に従って作成するスクリプトを変更する。
    • テーブルまたはインデックスのパーティション構成をレプリケートする。
      パーティション構成のスクリプトを作成する。
    • 圧縮設定のレプリケートする。
      圧縮設定のスクリプトを作成する。

データ圧縮とパーティション

「パーティション分割」と「データ圧縮」の併用によって、
必要な「パーティション」のみ「データ圧縮」するよう選択できる。

圧縮対象のパーティション

下記のような「パーティション」は、
「データ圧縮」しない(若しくは行圧縮のみ適用)。

  • 頻繁にアクセスする「パーティション」
  • データの変更が頻繁に発生する「パーティション」

圧縮対象でないパーティション

下記のような「パーティション」は、
「データ圧縮」する(ページ圧縮を適用)。

  • あまりアクセスしない「パーティション」
  • 確定している過去データの読み取り専用「パーティション」

圧縮時の注意点

「パーティション」を「データ圧縮」する場合は、以下の点に注意する。

既存の「パーティション」の分割

元の「パーティション」のデータ圧縮属性が、
分割後の双方の「パーティション」に継承される。

既存の「パーティション」のマージ

マージ先「パーティション」のデータ圧縮属性が、
得られる「パーティション」に継承される。

既存の「パーティション」の切替え

「パーティション」のデータ圧縮属性が、
テーブルのデータ圧縮属性と一致する必要がある。

変更時の考慮点

パーティション or テーブル全体

既存の「パーティション テーブル」・「パーティション インデックス」の
圧縮設定の変更( = 再構築)に使用できる構文には、次の2つの構文が利用できる。

  • 参照されているパーティションのみ再構築
    ALTER { TABLE | INDEX } object_name
    REBUILD PARTITION = partition_number WITH (DATA_COMPRESSION = <option>)
  • テーブル全体を再構築(パーティションの既存の圧縮設定を使用)
    ALTER { TABLE | INDEX } object_name
    REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE ON
    PARTITIONS ({ <partition_number_expression> | <range> }), ... ) 

クラスタ化インデックスの削除

  • オフライン で「パーティション分割」された「クラスタ化インデックス」を削除した場合、
    • 「クラスタ化インデックス」の上位レベルだけが削除されるため、操作は高速だが、
      「パーティション構成」を変更しない限り、ヒープ上のデータ圧縮属性が維持される。
    • これは、「パーティション構成」を変更するか、明示的に
      ALTER TABLE ... REBUILD ... ステートメントを実行、再構築することにより解除できる。
  • なお、オンラインで「パーティション分割」された「クラスタ化インデックス」を削除した場合、
    • SQL Server によって、自動的に再構築され、データ圧縮属性が解除される。

圧縮の効果

参考


Tags: :データアクセス, :SQL Server


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-16 (日) 15:46:15 (793d)