テーブルまたはインデックスの圧縮の有効化

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsAnalytics Platform System (PDW)

この記事では、SQL Server で SQL Server Management Studio または Transact-SQL を使用して、既存のテーブルまたはインデックスでデータ圧縮を有効にする方法について説明します。 テーブルやインデックスの作成時にデータ圧縮を有効にするには、「圧縮されたインデックスを作成する」と「行の圧縮を使用するテーブルの作成」の例を参照してください。

制限事項と制約事項

  • システム テーブルで圧縮を有効にすることはできません。

  • テーブルがヒープの場合、ONLINE モードでは、再構築操作がシングル スレッドになります。 マルチスレッドのヒープの再構築操作では、OFFLINE モードを使用してください。 OFFLINE オプションを指定しない限り、再構築操作は ONLINE です。 ONLINE 再構築の実行の詳細については、「オンラインでのインデックス操作の実行」を参照してください。

  • 固定されていないインデックスがテーブルにある場合、その 1 つのパーティションの圧縮設定を変更できません。

  • 一部のデータ型はデータ圧縮の影響を受けません。 詳細については、「行の圧縮によるストレージへの影響」を参照してください。

アクセス許可

テーブルまたはインデックスに対する ALTER アクセス許可が必要です。

SQL Server Management Studio の使用 [SQL Server]

  1. オブジェクト エクスプローラーで、圧縮するテーブルを含むデータベースを展開します。次に、 [テーブル] フォルダーを展開します。

  2. インデックスを圧縮するには、圧縮するインデックスを含むテーブルを展開します。次に、 [インデックス] フォルダーを展開します。

  3. 圧縮するテーブルまたはインデックスを右クリックし、 [ストレージ] をポイントして、 [圧縮の管理] をクリックします。

  4. データ圧縮ウィザードの [データ圧縮ウィザードへようこそ] ページで、 [次へ] を選択します。

  5. [圧縮の種類の選択] ページで、圧縮するテーブルまたはインデックスの各パーティションに適用する圧縮の種類を選択します。 完了したら [次へ] を選択します。

    [圧縮の種類の選択] ページには次のオプションがあります。

    • [すべてのパーティションに同じ種類の圧縮を使用する] チェック ボックス

      すべてのパーティションに対して同じ圧縮設定を構成する場合に選択します。 これにより、選択ボックスが有効になり、グリッドにある [圧縮の種類] 列が無効になります。 オンにすると、隣接するリストのオプションは、 [なし][行] 、および [ページ] になります。

    • [パーティション番号]

      テーブルまたはインデックスで各パーティションを一覧表示します。 この列は読み取り専用です。

    • [圧縮の種類]

      各パーティションの圧縮オプションを選択します。 [すべてのパーティションに対して同じ圧縮の種類を使用] が選択されている場合は、使用できません。 リストのオプションは、 [なし][行] 、および [ページ] です。

    • [境界]

      パーティションの境界が表示されます。 この列は読み取り専用です。

    • 行数

      このパーティションの行数を表示します。 この列は読み取り専用です。

    • [現在の領域]

      このパーティションが占有する現在の領域をメガバイト (MB) 単位で表示します。 この列は読み取り専用です。

    • [要求された圧縮の領域]

      [計算] を選択した場合、この列には、 [圧縮の種類] 列に指定した設定を使用して圧縮後の各パーティションを推定したサイズが表示されます。 この列は読み取り専用です。

    • [計算]

      [圧縮の種類] 列に指定した設定を使用して圧縮後の各パーティションのサイズを推定する場合に選択します。

  6. [出力オプションの選択] ページで、圧縮を完了する方法を指定します。 ウィザードの前のページに基づいて SQL スクリプトを作成するには、 [スクリプトの作成] を選択します。 ウィザードの残りのすべてのページが完了した後に新しいパーティション テーブルを作成するには、 [すぐに実行する] を選択します。 事前に定義した時刻に新しいパーティション テーブルを作成するには、 [スケジュール] を選択します。

    [スクリプトの作成] を選択した場合、 [スクリプト オプション] で次のオプションを使用できます。

    • [スクリプトをファイルに保存]
      スクリプトを .sql ファイルとして生成します。 [ファイル名] ボックスにファイルの名前と場所を入力するか、 [参照] を選択して [スクリプト ファイルの場所] ダイアログ ボックスを開きます。 [名前を付けて保存] で、 [Unicode テキスト] または [ANSI テキスト] を選択します。

    • [スクリプトをクリップボードに保存]
      スクリプトをクリップボードに保存します。

    • [スクリプトを新しいクエリ ウィンドウに保存]
      新しいクエリ エディター ウィンドウにスクリプトを生成します。 これは既定値です。

    • [スケジュール] を選択した場合は、 [スケジュールの変更] を選択します。

    1. [新しいジョブ スケジュール] ダイアログ ボックスで、 [名前] ボックスに、ジョブのスケジュールの名前を入力します。

    2. [スケジュールの種類] ボックスで、スケジュールの種類を選択します。

      • [SQL Server エージェントの開始時に自動的に開始]

      • [CPU がアイドル状態になったときに開始]

      • [定期的] 。 新しいパーティション テーブルを新しい情報で定期的に更新するには、このオプションを選択します。

      • [指定日時] 。 既定では、このオプションが選択されています。

    3. [有効] チェック ボックスをオンまたはオフにして、スケジュールを有効または無効にします。

    4. [定期的] を選択した場合:

      1. [頻度][実行] ボックスの一覧で、実行の頻度を指定します。

        • [日単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を日単位で入力します。

        • [週単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を週単位で入力します。 ジョブ スケジュールを実行する曜日を選択します。

        • [月単位] を選択した場合は、 [日] または [曜日] を選択します。

          • [日] を選択した場合は、ジョブ スケジュールを実行する日付と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の 15 日にジョブ スケジュールを実行する場合は、 [日] を選択し、1 番目のボックスに「15」と入力し、2 番目のボックスに「2」と入力します。 2 番目のボックスで使用できる最大値は "99" です。

          • [曜日] を選択した場合は、ジョブ スケジュールを実行する曜日と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の最後の平日にジョブ スケジュールを実行する場合は、 [日] を選択し、リストから [最終] を選択します。次に 2 番目のリストから [平日] を選択し、最後のボックスに「2」と入力します。 [第 1][第 2][第 3] 、または [第 4] も、特定の平日 (たとえば、日曜日や水曜日) に加えて、最初の 2 つのリストから選択できます。 最後のボックスで使用できる最大値は "99" です。

      2. [一日のうちの頻度] で、頻度、ジョブ スケジュールを実行する当日にジョブ スケジュールを繰り返す頻度を指定します。

        • [1 回] を選択した場合は、ジョブ スケジュールを実行する特定の時刻を [1 回] ボックスに入力します。 間、分、秒に加え、午前か午後かを入力します。

        • [間隔] を選択した場合は、 [頻度] で選択した日にジョブ スケジュールを実行する頻度を指定します。 たとえば、ジョブ スケジュールを実行する当日に 2 時間おきにジョブ スケジュールを実行する場合は、 [間隔] を選択し、1 番目のボックスに「2」と入力してから、 [時間] を選択します。 このリストでは、 [分][秒] を選択することもできます。 1 番目のボックスで使用できる最大値は "100" です。

          [開始] ボックスに、ジョブ スケジュールの実行を開始する時刻を入力します。 [終了] ボックスに、ジョブ スケジュールの実行を終了する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。

      3. [期間] で、 [開始日] に、ジョブ スケジュールの実行を開始する日付を入力します。 [終了日] を選択します。ジョブ スケジュールの実行を停止するタイミングを指定しない場合は、 [終了日なし] を選択します。 [終了日] を選択した場合は、ジョブ スケジュールの実行を停止する日付を入力します。

    5. [指定日時] を選択した場合は、 [指定日時に発生][日付] ボックスに、ジョブ スケジュールを実行する日付を入力します。 [時刻] ボックスに、ジョブ スケジュールを実行する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。

    6. [概要][説明] で、すべてのジョブ スケジュール設定が適切であることを確認します。

    7. [OK] を選択します。

    このページを完了したら、 [次へ] を選択します。

  7. [概要の確認] ページの [選択内容の確認] で、使用可能なすべてのオプションを展開し、すべての圧縮設定が適切であることを確認します。 すべての設定が適切であることを確認したら、 [完了] を選択します。

  8. [圧縮ウィザードの進行状況] ページで、パーティションの作成ウィザードの操作に関する状態情報を監視します。 ウィザードで選択したオプションに応じて、[進行状況] ページに 1 つまたは複数のアクションが含まれる可能性があります。 上部のボックスには、ウィザードの全体的な状態と受信した状態メッセージ、エラー メッセージ、および警告メッセージの数が表示されます。

    [圧縮ウィザードの進行状況] ページでは、次のオプションを使用できます。

    • 詳細

      アクション、状態、およびウィザードで実行したアクションから返されたメッセージが提供されます。

    • 操作

      各アクションの種類と名前を指定します。

    • 状態

      全体としてウィザードのアクションが [成功] または [失敗] のいずれの値を返したかを示します。

    • メッセージ

      プロセスから返されたすべてのエラー メッセージまたは警告メッセージを提供します。

    • Report

      パーティションの作成ウィザードの結果を含むレポートを作成します。 [レポートの表示][レポートをファイルに保存][レポートをクリップボードにコピー][レポートを電子メールとして送信] の各オプションがあります。

    • [レポートの表示]

      パーティションの作成ウィザードの進行状況に関するテキスト レポートを表示する [レポートの表示] ダイアログ ボックスを開きます。

    • [レポートをファイルに保存]

      [レポートに名前を付けて保存] ダイアログ ボックスを開きます。

    • [レポートをクリップボードにコピー]

      ウィザードの進行状況レポートの結果をクリップボードにコピーします。

    • [レポートを電子メールとして送信]

      ウィザードの進行状況レポートの結果を電子メール メッセージにコピーします。

    完了したら、 [閉じる] を選択します。

Transact-SQL の使用

SQL Server

SQL Server で、sp_estimate_data_compression_savings を実行してから、テーブルまたはインデックスの圧縮を有効にします。 以下のセクションをご覧ください。

テーブルで圧縮を有効にする

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、最初にストアド プロシージャ sp_estimate_data_compression_savings を実行して、行の ROW 圧縮設定を使用した場合のオブジェクトの推定サイズを返します。 次に、指定したテーブルのすべてのパーティションで行の ROW 圧縮を有効にします。

    USE AdventureWorks2022;
    GO
    EXEC sp_estimate_data_compression_savings 'Production', 'TransactionHistory', NULL, NULL, 'ROW';
    
    ALTER TABLE Production.TransactionHistory REBUILD PARTITION = ALL
    WITH (DATA_COMPRESSION = ROW);
    GO
    

インデックスで圧縮を有効にする

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、最初に sys.indexes カタログ ビューを問い合わせて、 index_id テーブルの各インデックスの名前と Production.TransactionHistory を返します。 次に、ストアド プロシージャ sp_estimate_data_compression_savings を実行して、PAGE の圧縮設定を使用した場合の指定されたインデックス ID の推定サイズを返します。 最後に、インデックス ID 2 (IX_TransactionHistory_ProductID) を再構築し、PAGE の圧縮を指定します。

    USE AdventureWorks2022;
    GO
    SELECT name, index_id
    FROM sys.indexes
    WHERE OBJECT_NAME (object_id) = N'TransactionHistory';
    
    EXEC sp_estimate_data_compression_savings
        @schema_name = 'Production',
        @object_name = 'TransactionHistory',
        @index_id = 2,
        @partition_number = NULL,
        @data_compression = 'PAGE';
    
    ALTER INDEX IX_TransactionHistory_ProductID ON Production.TransactionHistory REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);
    GO
    

Azure SQL Database 上

Azure SQL データベース は sp_estimate_data_compression_savings ストアド プロシージャをサポートしていません。 次のスクリプトでは、圧縮率を推定せずに圧縮を行うことができます。

テーブルで圧縮を有効にする

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、指定したテーブルのすべてのパーティションで行の ROW 圧縮を有効にします。

    USE AdventureWorks2022;
    GO
    
    ALTER TABLE Production.TransactionHistory REBUILD PARTITION = ALL
    WITH (DATA_COMPRESSION = ROW);
    GO
    

インデックスで圧縮を有効にする

  1. オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。

  2. 標準バーで、 [新しいクエリ] を選択します。

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、最初に sys.indexes カタログ ビューを問い合わせて、 index_id テーブルの各インデックスの名前と Production.TransactionHistory を返します。 最後に、インデックス ID 2 (IX_TransactionHistory_ProductID) を再構築し、PAGE の圧縮を指定します。

    USE AdventureWorks2022;
    GO
    SELECT name, index_id
    FROM sys.indexes
    WHERE OBJECT_NAME (object_id) = N'TransactionHistory';
    
    ALTER INDEX IX_TransactionHistory_ProductID ON Production.TransactionHistory REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = PAGE);
    GO
    

詳細については、「ALTER TABLE (Transact-SQL)」と「ALTER INDEX (Transact-SQL)」を参照してください。

関連項目