「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。

-[[戻る>SQL Server]]

* 目次 [#v7039b0b]
#contents

*概要 [#i827c095]
SQL Server は、2008から、
-テーブルとインデックスの両方で
-「データ圧縮」(行とページの圧縮)

をサポートしている。

なお、「データ圧縮」は、
-SQL Server 2008のEnterprise EditionおよびDeveloper Editionでのみ使用でき、
-SQL Server Management Studioの「データ圧縮ウィザード」でもサポートされる。

*圧縮対象 [#u8172dd0]
**[[テーブル>SQL Server のインデックス]] [#y07b3bb6]
***クラスタ化インデックス [#u1e96844]
***非クラスタ化インデックスのヒープ [#y913c235]

**[[インデックス>SQL Server のインデックス]] [#y483dace]
***非クラスタ化インデックス [#o8394a6c]
***インデックス付きビュー [#b3084290]

**[[パーティション>SQL Server パーティション分割]] [#s61b633a]
「パーティション分割」されているテーブルとインデックス。~
※ この場合、「パーティション」毎に、別々の圧縮オプションを指定できる。

***パーティション テーブル [#ee5689d6]
***パーティション インデックス [#lf021b2a]

*行圧縮とページ圧縮 [#ud017f6b]
**行圧縮 [#h43c956b]
行圧縮は、

>SQL Server 2005 SP2以降で提供されたvardecimalデータ型と同じような動作~
(固定長データ型の利用していない領域を削り、可変長データ型のように扱う)

で、圧縮を行う。

**ページ圧縮 [#w84bcaf3]
***圧縮方法 [#y0e95515]
-プレフィックス圧縮
--このプレフィックスは、=列値の先頭から一致するデータパターン。
--列毎に、プレフィックスがページのヘッダに移動される。
--列の値は、プレフィックス参照に変更される。

-ディクショナリ圧縮
--このディクショナリは、=列値と完全に一致する値のリスト。
--プレフィックス圧縮の完了後、ディクショナリ圧縮が適用される。
--ディクショナリ圧縮は、1つの列に制限されない。~
ページ上の任意の場所を対象とすることができる。

***ページと圧縮の方法 [#b27bb774]
-リーフ レベル ページ
--行圧縮
--プレフィックス圧縮
--ディクショナリ圧縮

-リーフ レベル ページ以外のページ
--行圧縮のみが使用される。

*注意事項 [#pf8f3354]

**必要なリソース [#w86ccfda]
***実行時 [#k8bdf4e0]
-CPUリソースを消費して、I/Oコストを下げるというもの。
--CPUコスト: 圧縮・解凍のオーバヘッド
--ストレージ コスト: I/Oとサイズの双方

-従って、何を圧縮すべきかどうかを検討する必要がある。

-参考
--第7回 大規模データ処理におけるCPUとI/Oのバランスをどう考えるか:~
RDBMSでも大規模データをあきらめないためには|gihyo.jp … 技術評論社~
http://gihyo.jp/admin/serial/01/rdbms/0007

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

**適用先 [#zc2fcf44]
***テーブル・インデックス [#gff6a90b]
-システム テーブルには適用されない。
-「クラスタ化インデックス」には、自動的に反映される。
-「非クラスタ化インデックス」には、自動的には反映されない。

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

**運用時の考慮点 [#oa87f4a5]
-テーブル(非クラスタ化インデックスのヒープ)の圧縮設定を変更する場合、~
「非クラスタ化インデックス」を再構築して、行識別子ポインタを変更する必要がある。

***ページ圧縮のトリガ [#w9bb9773]
-ページ圧縮は、ページがいっぱいになった状態で、~
(INSERT INTO、BULK INSERTを使用して、)~
行追加することによって開始される。

-以降の行追加に対しては、基本的にページ圧縮が適用される。
-既存のテーブルに適用する場合は、直ちに各ページが評価・再構築される。

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

***SQL Serverコンポーネントへの影響 [#z891dac9]
-影響の無いもの
--バックアップ・リストア()
--ログ配布(トランザクション・ログのため)

-影響の有るもの
--クエリ プラン~
ページ数とページあたりの行数が異なるためクエリ プランの変更を伴う。

--一括インポート操作と一括エクスポート操作~
エクスポート時は、非圧縮のデータとなるため、操作に圧縮・解凍が伴う。

--レプリケーション~
以下のレプリケーションの範囲に従って作成するスクリプトを変更する。
---テーブルまたはインデックスのパーティション構成をレプリケートする。~
パーティション構成のスクリプトを作成する。
---圧縮設定のレプリケートする。~
圧縮設定のスクリプトを作成する。

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

**圧縮対象のパーティション [#r4d705e7]
下記のような「パーティション」は、~
「データ圧縮」しない(若しくは行圧縮のみ適用)。
-頻繁にアクセスする「パーティション」
-データの変更が頻繁に発生する「パーティション」

**圧縮対象でないパーティション [#d0ef9430]
下記のような「パーティション」は、~
「データ圧縮」する(ページ圧縮を適用)。
-あまりアクセスしない「パーティション」
-確定している過去データの読み取り専用「パーティション」

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

***既存の「パーティション」の分割 [#t6ad53c7]
元の「パーティション」のデータ圧縮属性が、~
分割後の双方の「パーティション」に継承される。

***既存の「パーティション」のマージ [#xd0bf8c0]
マージ先「パーティション」のデータ圧縮属性が、~
得られる「パーティション」に継承される。

***既存の「パーティション」の切替え [#k93a19d0]
「パーティション」のデータ圧縮属性が、~
テーブルのデータ圧縮属性と一致する必要がある。

**変更時の考慮点 [#a394736d]
***パーティション or テーブル全体 [#uae2cd19]
既存の「パーティション テーブル」・「パーティション インデックス」の~
圧縮設定の変更( = 再構築)に使用できる構文には、次の2つの構文が利用できる。

-index_option (Transact-SQL)~
http://msdn.microsoft.com/ja-jp/library/ms186869.aspx

--参照されているパーティションのみ再構築
 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> }), ... ) 


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

-なお、オンラインで「パーティション分割」された「クラスタ化インデックス」を削除した場合、
--SQL Server によって、自動的に再構築され、データ圧縮属性が解除される。

*圧縮の効果 [#of7bba94]
-PRIME3 - PROJECT3~
http://jp.fujitsu.com/solutions/sap/brochures/pdf/prime3project3.pdf

*参考 [#s712790e]
-データベース機能
--行の圧縮の実装~
https://msdn.microsoft.com/ja-jp/library/cc280576.aspx
--ページの圧縮の実装~
http://msdn.microsoft.com/ja-jp/library/cc280464.aspx

-データ圧縮:キャパシティ プランニングとベスト プラクティス~
https://technet.microsoft.com/ja-jp/library/dd894051.aspx

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



トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS