「[[マイクロソフト系技術情報 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の「データ圧縮ウィザード」でもサポートされる。 -[[SQL Server Management Studio>SSMS]]の「データ圧縮ウィザード」でもサポートされる。 *圧縮対象 [#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]]