テーブルまたはインデックスの圧縮の有効化
適用対象: SQL Server Azure SQL データベース Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)
この記事では、SQL Server で SQL Server Management Studio または Transact-SQL を使用して、既存のテーブルまたはインデックスでデータ圧縮を有効にする方法について説明します。 テーブルやインデックスの作成時にデータ圧縮を有効にするには、「圧縮されたインデックスを作成する」と「行の圧縮を使用するテーブルの作成」の例を参照してください。
制限事項
システム テーブルで圧縮を有効にすることはできません。
テーブルがヒープの場合、
ONLINE
モードでは、再構築操作がシングル スレッドになります。 マルチスレッドのヒープの再構築操作では、OFFLINE
モードを使用してください。OFFLINE
オプションを指定しない限り、再構築操作はONLINE
です。ONLINE
再構築の実行の詳細については、「オンラインでのインデックス操作の実行」を参照してください。固定されていないインデックスがテーブルにある場合、その 1 つのパーティションの圧縮設定を変更できません。
一部のデータ型はデータ圧縮の影響を受けません。 詳細については、「行の圧縮によるストレージへの影響」を参照してください。
アクセス許可
テーブルまたはインデックスに対する ALTER
アクセス許可が必要です。
SQL Server Management Studio を使用します。
オブジェクト エクスプローラーで、圧縮するテーブルを含むデータベースを展開します。次に、 [テーブル] フォルダーを展開します。
インデックスを圧縮するには、圧縮するインデックスを含むテーブルを展開します。次に、 [インデックス] フォルダーを展開します。
圧縮するテーブルまたはインデックスを右クリックし、 [ストレージ] をポイントして、 [圧縮の管理] をクリックします。
データ圧縮ウィザードの [データ圧縮ウィザードへようこそ] ページで、 [次へ] を選択します。
[圧縮の種類の選択] ページで、圧縮するテーブルまたはインデックスの各パーティションに適用する圧縮の種類を選択します。 完了したら [次へ] を選択します。
[圧縮の種類の選択] ページには次のオプションがあります。
[すべてのパーティションに同じ種類の圧縮を使用する] チェック ボックス
すべてのパーティションに対して同じ圧縮設定を構成する場合に選択します。 これにより、選択ボックスが有効になり、グリッドにある [圧縮の種類] 列が無効になります。 オンにすると、隣接するリストのオプションは、 [なし] 、 [行] 、および [ページ] になります。
[パーティション番号]
テーブルまたはインデックスで各パーティションを一覧表示します。 この列は読み取り専用です。
[圧縮の種類]
各パーティションの圧縮オプションを選択します。 [すべてのパーティションに対して同じ圧縮の種類を使用] が選択されている場合は、使用できません。 リストのオプションは、 [なし] 、 [行] 、および [ページ] です。
[境界]
パーティションの境界が表示されます。 この列は読み取り専用です。
行数
このパーティションの行数を表示します。 この列は読み取り専用です。
[現在の領域]
このパーティションが占有する現在の領域をメガバイト (MB) 単位で表示します。 この列は読み取り専用です。
[要求された圧縮の領域]
[計算] を選択した場合、この列には、 [圧縮の種類] 列に指定した設定を使用して圧縮後の各パーティションを推定したサイズが表示されます。 この列は読み取り専用です。
[計算]
[圧縮の種類] 列に指定した設定を使用して圧縮後の各パーティションのサイズを推定する場合に選択します。
[出力オプションの選択] ページで、圧縮を完了する方法を指定します。 ウィザードの前のページに基づいて SQL スクリプトを作成するには、 [スクリプトの作成] を選択します。 ウィザードの残りのすべてのページが完了した後に新しいパーティション テーブルを作成するには、 [すぐに実行する] を選択します。 事前に定義した時刻に新しいパーティション テーブルを作成するには、 [スケジュール] を選択します。
[スクリプトの作成] を選択した場合、 [スクリプト オプション] で次のオプションを使用できます。
[スクリプトをファイルに保存]
スクリプトを
.sql
ファイルとして生成します。 [ファイル名] ボックスにファイルの名前と場所を入力するか、 [参照] を選択して [スクリプト ファイルの場所] ダイアログ ボックスを開きます。 [名前を付けて保存] で、 [Unicode テキスト] または [ANSI テキスト] を選択します。[スクリプトをクリップボードに保存]
スクリプトをクリップボードに保存します。
[スクリプトを新しいクエリ ウィンドウに保存]
新しいクエリ エディター ウィンドウにスクリプトを生成します。 これは既定値です。
[スケジュール] を選択した場合は、 [スケジュールの変更] を選択します。
[新しいジョブ スケジュール] ダイアログ ボックスで、 [名前] ボックスに、ジョブのスケジュールの名前を入力します。
[スケジュールの種類] ボックスで、スケジュールの種類を選択します。
[SQL Server エージェントの開始時に自動的に開始]
[CPU がアイドル状態になったときに開始]
[定期的] 。 新しいパーティション テーブルを新しい情報で定期的に更新するには、このオプションを選択します。
[指定日時] 。 既定では、このオプションが選択されています。
[有効] チェック ボックスをオンまたはオフにして、スケジュールを有効または無効にします。
[定期的] を選択した場合:
[頻度] の [実行] ボックスの一覧で、実行の頻度を指定します。
[日単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を日単位で入力します。
[週単位] を選択した場合は、 [間隔] ボックスに、ジョブ スケジュールを繰り返す頻度を週単位で入力します。 ジョブ スケジュールを実行する曜日を選択します。
[月単位] を選択した場合は、 [日] または [曜日] を選択します。
[日] を選択した場合は、ジョブ スケジュールを実行する日付と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の 15 日にジョブ スケジュールを実行する場合は、 [日] を選択し、1 番目のボックスに「15」と入力し、2 番目のボックスに「2」と入力します。 2 番目のボックスで使用できる最大値は "99" です。
[曜日] を選択した場合は、ジョブ スケジュールを実行する曜日と、ジョブ スケジュールを繰り返す頻度を月単位で指定します。 たとえば、隔月の最後の平日にジョブ スケジュールを実行する場合は、 [日] を選択し、リストから [最終] を選択します。次に 2 番目のリストから [平日] を選択し、最後のボックスに「2」と入力します。 [第 1] 、 [第 2] 、 [第 3] 、または [第 4] も、特定の平日 (たとえば、日曜日や水曜日) に加えて、最初の 2 つのリストから選択できます。 最後のボックスで使用できる最大値は "99" です。
[一日のうちの頻度] で、頻度、ジョブ スケジュールを実行する当日にジョブ スケジュールを繰り返す頻度を指定します。
[1 回] を選択した場合は、ジョブ スケジュールを実行する特定の時刻を [1 回] ボックスに入力します。 間、分、秒に加え、午前か午後かを入力します。
[間隔] を選択した場合は、 [頻度] で選択した日にジョブ スケジュールを実行する頻度を指定します。 たとえば、ジョブ スケジュールを実行する当日に 2 時間おきにジョブ スケジュールを実行する場合は、 [間隔] を選択し、1 番目のボックスに「2」と入力してから、 [時間] を選択します。 このリストでは、 [分] と [秒] を選択することもできます。 1 番目のボックスで使用できる最大値は "100" です。
[開始] ボックスに、ジョブ スケジュールの実行を開始する時刻を入力します。 [終了] ボックスに、ジョブ スケジュールの実行を終了する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。
[期間] で、 [開始日] に、ジョブ スケジュールの実行を開始する日付を入力します。 [終了日] を選択します。ジョブ スケジュールの実行を停止するタイミングを指定しない場合は、 [終了日なし] を選択します。 [終了日] を選択した場合は、ジョブ スケジュールの実行を停止する日付を入力します。
[指定日時] を選択した場合は、 [指定日時に発生] の [日付] ボックスに、ジョブ スケジュールを実行する日付を入力します。 [時刻] ボックスに、ジョブ スケジュールを実行する時刻を入力します。 間、分、秒に加え、午前か午後かを入力します。
[概要] の [説明] で、すべてのジョブ スケジュール設定が適切であることを確認します。
[OK] を選択します。
このページを完了したら、 [次へ] を選択します。
[概要の確認] ページの [選択内容の確認] で、使用可能なすべてのオプションを展開し、すべての圧縮設定が適切であることを確認します。 すべての設定が適切であることを確認したら、 [完了] を選択します。
[圧縮ウィザードの進行状況] ページで、パーティションの作成ウィザードの操作に関する状態情報を監視します。 ウィザードで選択したオプションに応じて、[進行状況] ページに 1 つまたは複数のアクションが含まれる可能性があります。 上部のボックスには、ウィザードの全体的な状態と受信した状態メッセージ、エラー メッセージ、および警告メッセージの数が表示されます。
[圧縮ウィザードの進行状況] ページでは、次のオプションを使用できます。
詳細
アクション、状態、およびウィザードで実行したアクションから返されたメッセージが提供されます。
操作
各アクションの種類と名前を指定します。
状態
全体としてウィザードのアクションが [成功] または [失敗] のいずれの値を返したかを示します。
メッセージ
プロセスから返されたすべてのエラー メッセージまたは警告メッセージを提供します。
Report
パーティションの作成ウィザードの結果を含むレポートを作成します。 [レポートの表示] 、 [レポートをファイルに保存] 、 [レポートをクリップボードにコピー] 、 [レポートを電子メールとして送信] の各オプションがあります。
[レポートの表示]
パーティションの作成ウィザードの進行状況に関するテキスト レポートを表示する [レポートの表示] ダイアログ ボックスを開きます。
[レポートをファイルに保存]
[レポートに名前を付けて保存] ダイアログ ボックスを開きます。
[レポートをクリップボードにコピー]
ウィザードの進行状況レポートの結果をクリップボードにコピーします。
[レポートを電子メールとして送信]
ウィザードの進行状況レポートの結果を電子メール メッセージにコピーします。
完了したら、 [閉じる] を選択します。
Transact-SQL の使用
選択したデータベースで、sp_estimate_data_compression_savings (Transact-SQL) を実行し、テーブルまたはインデックスの圧縮を有効にします。 以下のセクションをご覧ください。
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
テーブルで圧縮を有効にする
オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。
標準バーで、 [新しいクエリ] を選択します。
データベースのコンテキストを使用していることを確認します。
次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、最初にストアド プロシージャ
sp_estimate_data_compression_savings
を実行して、行のROW
圧縮設定を使用した場合のオブジェクトの推定サイズを返します。 次に、指定したテーブルのすべてのパーティションで行のROW
圧縮を有効にします。EXEC sp_estimate_data_compression_savings 'Production', 'TransactionHistory', NULL, NULL, 'ROW'; ALTER TABLE Production.TransactionHistory REBUILD PARTITION = ALL WITH (DATA_COMPRESSION = ROW); GO
インデックスで圧縮を有効にする
オブジェクト エクスプローラーで、 データベース エンジンのインスタンスに接続します。
標準バーで、 [新しいクエリ] を選択します。
データベースのコンテキストを使用していることを確認します。
次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、最初に
sys.indexes
カタログ ビューを問い合わせて、index_id
テーブルの各インデックスの名前とProduction.TransactionHistory
を返します。 次に、ストアド プロシージャsp_estimate_data_compression_savings
を実行して、PAGE
の圧縮設定を使用した場合の指定されたインデックス ID の推定サイズを返します。 最後に、インデックス ID 2 (IX_TransactionHistory_ProductID
) を再構築し、PAGE
の圧縮を指定します。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
詳細については、「ALTER TABLE」と「ALTER INDEX」を参照してください。