次の方法で共有


データ圧縮

SQL Server 2014 では、行ストア テーブルとインデックスの行圧縮とページ圧縮がサポートされ、列ストア テーブルおよびインデックスの列ストア圧縮および列ストア アーカイブ圧縮がサポートされています。

行ストア テーブルとインデックスの場合は、データ圧縮機能を使用してデータベースのサイズを小さくします。 データ圧縮は領域を節約するだけでなく、データが格納されるページ数が少なく、クエリがディスクから読み取る必要があるページが少なくなるため、I/O 集中型ワークロードのパフォーマンスを向上するのに役立ちます。 ただし、アプリケーションとの間でデータが交換される間は、データの圧縮と圧縮解除のためデータベース サーバーで追加の CPU リソースが必要になります。 次のデータベース オブジェクトで行とページの圧縮を構成できます。

  • ヒープとして格納されているテーブル全体。

  • クラスター化インデックスとして格納されているテーブル全体。

  • 非クラスター化インデックス全体。

  • 全体のインデックス付きビュー。

  • パーティション テーブルとパーティション インデックスの場合は、各パーティションの圧縮オプションを構成できます。また、オブジェクトのさまざまなパーティションに同じ圧縮設定を設定する必要はありません。

列ストア テーブルとインデックスの場合、すべての列ストア テーブルとインデックスでは常に列ストア圧縮が使用され、ユーザーが構成することはできません。 列ストアのアーカイブ圧縮を使用して、データの格納と取得に余分な時間と CPU リソースを割り当てることができる状況に備えて、データ サイズをさらに小さくします。 列ストアアーカイブ圧縮は、次のデータベース オブジェクトで構成できます。

  • 列ストア テーブル全体またはクラスター化列ストア インデックス全体。 列ストア テーブルはクラスター化列ストア インデックスとして格納されるため、どちらの方法も同じ結果になります。

  • 非クラスター化列ストア インデックスの全体。

  • パーティション分割列ストア テーブルと列ストア インデックスの場合は、各パーティションのアーカイブ圧縮オプションを構成できます。また、さまざまなパーティションに同じアーカイブ圧縮設定を設定する必要はありません。

行とページの圧縮を使用する場合の考慮事項

行とページの圧縮を使用する場合は、次の考慮事項に注意してください。

  • データ圧縮の詳細は、サービス パックまたは以降のリリースで予告なく変更される場合があります。

  • SQL Server のすべてのエディションで圧縮を使用できるわけではありません。 詳しくは「 Features Supported by the Editions of SQL Server 2014」をご覧ください。

  • システム テーブルでは圧縮を使用できません。

  • 圧縮を使用すると、ページに格納する行を増やすことができますが、テーブルまたはインデックスの最大行サイズは変更されません。

  • 最大行サイズと圧縮オーバーヘッドが最大行サイズ 8060 バイトを超える場合、テーブルで圧縮を有効にすることはできません。 たとえば、列 c1char(8000) および c2char(53) を持つテーブルは、追加の圧縮オーバーヘッドのため圧縮できません。 vardecimal ストレージ形式を使用すると、フォーマットが有効になっているときに行サイズのチェックが実行されます。 行とページの圧縮では、オブジェクトが最初に圧縮されたときに行サイズチェックが実行され、各行が挿入または変更されたときにチェックされます。 圧縮では、次の 2 つの規則が適用されます。

    • 固定長型の更新は常に成功する必要があります。

    • データ圧縮の無効化は常に成功する必要があります。 圧縮された行がページに収まる場合でも、8060 バイト未満であることを意味します。SQL Server では、非圧縮時に行に収まらない更新プログラムが防止されます。

  • パーティションの一覧を指定すると、個々のパーティションで圧縮の種類を ROW、PAGE、または NONE に設定できます。 パーティションの一覧が指定されていない場合、すべてのパーティションは、ステートメントで指定されたデータ圧縮プロパティを使用して設定されます。 テーブルまたはインデックスが作成されると、特に指定しない限り、データ圧縮は NONE に設定されます。 特に指定しない限り、既存の圧縮はテーブルの変更時にも保持されます。

  • 範囲外の一連のパーティションまたは単独のパーティションを指定すると、エラーが生成されます。

  • 非クラスター化インデックスは、テーブルの圧縮プロパティを継承しません。 インデックスを圧縮するには、インデックスの圧縮プロパティを明示的に設定する必要があります。 既定では、インデックスの作成時にインデックスの圧縮設定が NONE に設定されます。

  • ヒープにクラスター化インデックスを作成する場合、圧縮状態を特に指定しない限り、ヒープの圧縮状態がクラスター化インデックスに継承されます。

  • ヒープがページ レベルの圧縮用に構成されている場合、ページは次の方法でのみページ レベルの圧縮を受け取ります。

    • データは、一括最適化を有効にして一括インポートされます。

    • データは INSERT INTO ... WITH (TABLOCK) 構文を使って挿入されます。テーブルには非クラスター化インデックスがありません。

    • ALTER TABLE ... REBUILD ステートメントを PAGE 圧縮オプションと共に実行してテーブルを再構築します。

  • DML 操作の一部としてヒープに割り当てられた新しいページでは、ヒープが再構築されるまで PAGE 圧縮は使用されません。 圧縮の削除と再適用、またはクラスター化インデックスの作成と削除によって、ヒープを再構築します。

  • ヒープの圧縮設定を変更するには、テーブル上のすべての非クラスター化インデックスを再構築して、ヒープ内の新しい行の場所へのポインターを持つ必要があります。

  • ROW または PAGE 圧縮は、オンラインまたはオフラインで有効または無効にすることができます。 オンライン操作の場合、ヒープに対する圧縮の有効化はシングル スレッドです。

  • 行またはページの圧縮を有効または無効にするためのディスク領域の要件は、インデックスを作成または再構築する場合と同じです。 パーティション分割されたデータの場合、一度に 1 つのパーティションの圧縮を有効または無効にすることで、必要な領域を減らすことができます。

  • パーティション テーブル内のパーティションの圧縮状態を確認するには、sys.partitions カタログ ビューのdata_compression列に対してクエリを実行します。

  • インデックスを圧縮する場合、リーフ レベルのページは行とページの両方の圧縮で圧縮できます。 リーフ レベル以外のページは、ページ圧縮を受け取りません。

  • サイズのため、大きな値のデータ型は、特殊な目的のページの通常の行データとは別に格納される場合があります。 データ圧縮は、個別に格納されているデータでは使用できません。

  • SQL Server 2005 で vardecimal ストレージ形式を実装したテーブルでは、アップグレード時にその設定が保持されます。 vardecimal ストレージ形式のテーブルに行圧縮を適用できます。 ただし、行圧縮は vardecimal ストレージ形式のスーパーセットであるため、vardecimal ストレージ形式を保持する理由はありません。 vardecimal ストレージ形式と行圧縮を組み合わせると、10 進値は追加の圧縮を行いません。 ページ圧縮は、vardecimal ストレージ形式のテーブルに適用できます。ただし、vardecimal ストレージ形式の列では、追加の圧縮が実行されない可能性があります。

    SQL Server 2014 では、vardecimal ストレージ形式がサポートされています。ただし、行レベルの圧縮は同じ目標を達成するため、vardecimal ストレージ形式は非推奨です。 この機能は、今後のバージョンの Microsoft SQL Server で削除される予定です。 新しい開発作業ではこの機能を使用しないでください。現在この機能を使用しているアプリケーションを変更することを計画してください。

列ストアとアーカイブ圧縮の使用

適用対象: SQL Server (SQL Server 2014 から 現在のバージョン)。

基本情報

列ストア テーブルとインデックスは、常に列ストア圧縮と共に格納されます。 アーカイブ圧縮と呼ばれる追加の圧縮を構成することで、列ストア データのサイズをさらに小さくできます。 アーカイブ圧縮を実行するために、SQL Server はデータに対して Microsoft XPRESS 圧縮アルゴリズムを実行します。 次のデータ圧縮の種類を使用して、アーカイブ圧縮を追加または削除します。

  • COLUMNSTORE_ARCHIVEデータ圧縮を使用して、アーカイブ圧縮で列ストア データを圧縮します。

  • アーカイブ圧縮を解凍するために COLUMNSTORE データ圧縮を使用します。 この結果のデータは、引き続き列ストア圧縮で圧縮されます。

アーカイブ圧縮を追加するには、 ALTER TABLE (Transact-SQL) または ALTER INDEX (Transact-SQL) を REBUILD オプションと DATA COMPRESSION = COLUMNSTORE と共に使用します。

例:

ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  COLUMNSTORE_ARCHIVE) ;  
  
ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION =  COLUMNSTORE_ARCHIVE) ;  
  
ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION =  COLUMNSTORE_ARCHIVE ON PARTITIONS (2,4)) ;  
  

アーカイブ圧縮を削除し、データを列ストア圧縮に復元するには、 ALTER TABLE (Transact-SQL) または ALTER INDEX (Transact-SQL) を REBUILD オプションと DATA COMPRESSION = COLUMNSTORE と共に使用します。

例:

ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  COLUMNSTORE) ;  
  
ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION =  COLUMNSTORE) ;  
  
ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = ALL WITH (DATA_COMPRESSION =  COLUMNSTORE ON PARTITIONS (2,4) ) ;  
  

次の例では、一部のパーティションにはデータ圧縮を列ストアとして設定し、他のパーティションには列ストア アーカイブとして設定します。

ALTER TABLE ColumnstoreTable1   
REBUILD PARTITION = ALL WITH (  
    DATA_COMPRESSION =  COLUMNSTORE ON PARTITIONS (4,5),  
    DATA COMPRESSION = COLUMNSTORE_ARCHIVE ON PARTITIONS (1,2,3)  
) ;  

[パフォーマンス]

アーカイブ圧縮を使用して列ストア インデックスを圧縮すると、アーカイブ圧縮のない列ストア インデックスよりもインデックスの実行速度が低下します。 アーカイブ圧縮は、余分な時間と CPU リソースを使用してデータを圧縮および取得できる場合にのみ使用します。

パフォーマンスが低下する利点は、頻繁にアクセスされないデータに役立つストレージの削減です。 たとえば、データの月ごとにパーティションがあり、アクティビティの大部分が直近の数か月間である場合は、ストレージ要件を減らすために古い月をアーカイブできます。

メタデータ

次のシステム ビューには、クラスター化インデックスのデータ圧縮に関する情報が含まれています。

  • sys.indexes (Transact-SQL) - type 列と type_desc 列には、CLUSTERED COLUMNSTORE と NONCLUSTERED COLUMNSTORE が含まれます。

  • sys.partitions (Transact-SQL) - data_compression 列と data_compression_desc 列には、COLUMNSTORE とCOLUMNSTORE_ARCHIVEが含まれます。

プロシージャ sp_estimate_data_compression_savings (Transact-SQL) は列ストア インデックスには適用されません。

パーティション テーブルとパーティション インデックスに対する圧縮の影響

パーティション テーブルとパーティション インデックスでデータ圧縮を使用する場合は、次の考慮事項に注意してください。

  • ALTER PARTITION ステートメントを使用してパーティションを分割する場合、両方のパーティションは元のパーティションのデータ圧縮属性を継承します。

  • 2 つのパーティションがマージされると、結果のパーティションは宛先パーティションのデータ圧縮属性を継承します。

  • パーティションを切り替えるには、パーティションのデータ圧縮プロパティがテーブルの圧縮プロパティと一致している必要があります。

  • パーティション テーブルまたはパーティション インデックスの圧縮を変更するために使用できる構文のバリエーションは 2 つあります。

    • 次の構文では、参照されるパーティションのみが再構築されます。

      ALTER TABLE <table_name>   
      REBUILD PARTITION = 1 WITH (DATA_COMPRESSION =  <option>)  
      
    • 次の構文では、参照されていないパーティションの既存の圧縮設定を使用して、テーブル全体を再構築します。

      ALTER TABLE <table_name>   
      REBUILD PARTITION = ALL   
      WITH (DATA_COMPRESSION = PAGE ON PARTITIONS(<range>),  
      ... )  
      

    パーティション インデックスは、ALTER INDEX を使用して同じ原則に従います。

  • クラスター化インデックスが削除されると、パーティション分割スキームが変更されない限り、対応するヒープ パーティションはデータ圧縮設定を保持します。 パーティション構成が変更されると、すべてのパーティションが非圧縮状態に再構築されます。 クラスター化インデックスを削除してパーティション構成を変更するには、次の手順が必要です。

    1. クラスター化インデックスを削除します。

    2. ALTER TABLE ... REBUILD ... オプションを使用してテーブルを変更し、圧縮オプションを指定します。

    クラスター化インデックスのオフラインを削除するには、クラスター化インデックスの上位レベルのみが削除されるため、非常に高速な操作です。 クラスター化インデックスがオンラインで削除されると、SQL Server は、手順 1 で 1 回、手順 2 で 1 回、ヒープを 2 回再構築する必要があります。

圧縮がレプリケーションに与える影響

レプリケーションでデータ圧縮を使用する場合は、次の考慮事項に注意してください。

  • スナップショット エージェントが初期スキーマ スクリプトを生成すると、新しいスキーマでは、テーブルとそのインデックスの両方に同じ圧縮設定が使用されます。 インデックスではなくテーブルに対して圧縮を有効にすることはできません。

  • トランザクション レプリケーションの場合、アーティクル スキーマ オプションによって、スクリプト化する必要がある依存オブジェクトとプロパティが決まります。 詳細については、「sp_addarticle」 参照してください。

    ディストリビューション エージェントは、スクリプトを適用するときに下位レベルのサブスクライバーをチェックしません。 圧縮のレプリケーションが選択されている場合、下位レベルのサブスクライバーでのテーブルの作成は失敗します。 混合トポロジの場合は、圧縮のレプリケーションを有効にしないでください。

  • マージ レプリケーションの場合、パブリケーション互換性レベルはスキーマ オプションをオーバーライドし、スクリプト化されるスキーマ オブジェクトを決定します。

    混合トポロジの場合、新しい圧縮オプションをサポートする必要がない場合は、パブリケーション互換性レベルを下位レベルのサブスクライバー バージョンに設定する必要があります。 必要な場合は、作成後にサブスクライバーのテーブルを圧縮します。

次の表は、レプリケーション中の圧縮を制御するレプリケーション設定を示しています。

ユーザーの意図 テーブルまたはインデックスのパーティション構成をレプリケートする 圧縮設定をレプリケートする スクリプトの動作
パーティション構成をレプリケートし、パーティションのサブスクライバーで圧縮を有効にするには。 正しい 正しい パーティション構成と圧縮設定の両方をスクリプト化します。
サブスクライバー上のデータを圧縮せずにパーティション構成をレプリケートする。 正しい いいえ パーティション構成をスクリプト化しますが、パーティションの圧縮設定はスクリプト化しません。
パーティション構成をレプリケートせず、サブスクライバー上のデータを圧縮しない。 いいえ いいえ パーティションまたは圧縮の設定はスクリプト化しません。
パブリッシャーで全パーティションが圧縮されている場合、サブスクライバーのテーブルを圧縮しますが、パーティション構成はレプリケートしません。 いいえ 正しい すべてのパーティションで圧縮が有効になっているかどうかを確認します。

テーブル レベルで圧縮をスクリプト化します。

圧縮が他の SQL Server コンポーネントに与える影響

圧縮はストレージ エンジンで行われ、データは SQL Server の他のほとんどのコンポーネントに非圧縮状態で表示されます。 これにより、他のコンポーネントに対する圧縮の影響を次に制限します。

  • 一括インポートおよびエクスポート操作

    ネイティブ形式でもデータがエクスポートされると、データは圧縮されていない行形式で出力されます。 これにより、エクスポートされたデータ ファイルのサイズがソース データよりも大幅に大きくなる可能性があります。

    データがインポートされるときに、ターゲット テーブルで圧縮が有効になっている場合、データはストレージ エンジンによって圧縮された行形式に変換されます。 これにより、データが非圧縮テーブルにインポートされる場合と比較して CPU 使用率が増加する可能性があります。

    ページ圧縮を使用してデータをヒープに一括インポートする場合、一括インポート操作では、データの挿入時にページ圧縮によるデータの圧縮が試行されます。

  • 圧縮はバックアップと復元には影響しません。

  • 圧縮はログ配布には影響しません。

  • データ圧縮はスパース列と互換性がありません。 そのため、スパース列を含むテーブルを圧縮することも、スパース列を圧縮テーブルに追加することもできません。

  • 圧縮を有効にすると、データが異なるページ数とページあたりの行数を使用して格納されるため、クエリ プランが変更される可能性があります。

こちらもご覧ください

行圧縮の実装
ページ圧縮の実装
Unicode 圧縮の実装
CREATE PARTITION SCHEME (Transact-SQL)
CREATE PARTITION 関数 (Transact-SQL)
CREATE TABLE (Transact-SQL)
テーブル変更 (Transact-SQL)
インデックス作成 (Transact-SQL)
ALTER INDEX (Transact-SQL)