ファイルの圧縮

適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance

この記事では、SQL Server Management Studio または Transact-SQL を使用し、SQL Server でデータまたはログ ファイルを圧縮する方法について説明します。

ファイルの末尾にあるデータのページを、ファイルの先頭に近い占有されていない領域に移動することにより、データ ファイルが圧縮され、領域が回復されます。 ファイル末尾に十分な空き領域が作成された場合は、ファイル末尾のデータ ページの割り当てを解除して、ファイル システムに戻すことができます。

制限事項

  • プライマリ データ ファイルを、model データベース内のプライマリ ファイルのサイズより小さくすることはできません。

推奨事項

  • 圧縮操作は、大きな DELETE ステートメント、テーブルの切り捨て、テーブルの削除操作など、大きな未使用のストレージ スペースを生成する操作の後に実行すると最も効果的です。

  • ほとんどのデータベースでは、毎日の定期的操作で使用するための空き領域が必要です。 データベース ファイルを繰り返し縮小しても、データベースのサイズが再び大きくなっていることがある場合は、通常の操作に空き領域が必要であることを示しています。 このような場合、データベースを繰り返し縮小することは無意味な操作です。 データベース ファイルを拡張するために必要な autogrow イベントは、パフォーマンスの妨げになります。

  • ファイルを圧縮するために移動されたデータは、ファイル内のあらゆる使用可能な場所に分散される場合があります。 これにより、インデックスの断片化が発生し、広範なインデックスを検索するクエリのパフォーマンスが低下する場合があります。 断片化を解消するには、圧縮後にファイルのインデックスを再構築することを検討してください。

  • 特別な要件がない限り、AUTO_SHRINK データベース オプションを ON に設定しないでください。

解説

進行中の圧縮操作は、データベース上の他のクエリをブロックしたり、既に進行中のクエリによってブロックされる可能性があります。 SQL Server 2022 (16.x) で導入された圧縮ファイル操作には、WAIT_AT_LOW_PRIORITY オプションがあります。 この機能は、DBCC SHRINKDATABASEDBCC SHRINKFILE の新しい追加オプションです。 WAIT_AT_LOW_PRIORITY モードの新しい圧縮操作が、実行時間の長いクエリが既に進行中であるために必要なロックを取得できない場合、圧縮操作は最終的に 1 分後にタイムアウトして静かに終了し、他のクエリがブロックされないようにします。 WAIT_AT_LOW_PRIORITY データ ファイル (mdf と .ndf) に適用されます。 トランザクション ログ ファイルには適用されません。 詳細については、DBCC SHRINKFILE に関するページを参照してください。

アクセス許可

sysadmin 固定サーバー ロールまたは db_owner 固定データベース ロールのメンバーシップが必要です。

SQL Server Management Studio (SSMS) の使用

SSMS を使用してデータ ファイルまたはログ ファイルを圧縮する

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

  2. [データベース] を展開し、圧縮するデータベースを右クリックします。

  3. [タスク] をポイントし、[圧縮] をポイントし、[ファイル] を選択します。

    データベース
    選択した データベースの名前が表示されます。

    ファイルの種類
    ファイルの種類を選択します。 選択できるファイルの種類は [データ] および [ログ] です。 既定の選択は [データ]です。 別のファイル グループの種類を選択すると、その選択に応じて他のフィールドの選択が変更されます。

    [ファイル グループ]
    上記で選択した [ファイルの種類] に関連付けられたファイル グループの一覧から、ファイル グループを選択します。 別のファイル グループを選択すると、その選択に応じて他のフィールドの選択が変更されます。

    ファイル名
    選択したファイル グループおよびファイルの種類で利用可能なファイルの一覧からファイルを選択します。

    場所
    現在選択されているファイルへの完全なパスを表示します。 このパスは編集できませんが、クリップボードにコピーできます。

    [現在割り当てられている領域]
    データ ファイルの場合は、現在割り当てられている領域が表示されます。 ログ ファイルの場合、DBCC SQLPERF(LOGSPACE) の出力から計算された現在割り当て済みスペースを表示します。

    [使用可能な空き領域]
    データ ファイルの場合、DBCC SHOWFILESTATS(fileid) の出力から計算された現在の空き空き領域を表示します。 ログ ファイルの場合、DBCC SQLPERF(LOGSPACE) の出力から計算された現在の使用可能な空き領域を表示します。

    [未使用領域を解放する]
    ファイル内のすべての未使用領域をオペレーティング システムに渡し、ファイルを最後に割り当てられたエクステントにまで圧縮して、データをまったく移動せずにファイル サイズを小さくします。 割り当てられていないページへの行の再割り当て処理は行われません。

    [未使用領域の解放前にページを再構成する]
    ターゲットファイルサイズを指定して DBCC SHRINKFILE を実行するのと同じです。 このオプションがオンになっている場合は、 [圧縮先のファイル] ボックスで対象ファイルのサイズを指定する必要があります。

    [圧縮先のファイル]
    圧縮操作の対象ファイルのサイズを指定します。 サイズは、現在割り当てられている領域より大きく、ファイルに割り当てられた合計エクステントよりも小さくする必要があります。 最小値または最大値の範囲外の値を入力した場合、フォーカスを変更したり、ツール バーのボタンを選択したりしたときに、入力した値が最小値または最大値に戻ります。

    [データを同じファイル グループの他のファイルに移行してファイルを空にする]
    指定したファイルからすべてのデータを移行します。 このオプションを使用すると、ALTER DATABASE ステートメントを使用してファイルを削除することができます。 このオプションは、EMPTYFILE オプションを指定して DBCC SHRINKFILE を実行することと同じです。 EMPTYFILE は、Azure SQL Database または Azure SQL Database ハイパースケールではサポートされていません。

  4. ファイルの種類とファイル名を選択します。

  5. 必要に応じて、 [未使用領域を解放する] をオンにします。

    このオプションをオンにすると、ファイル内の未使用領域がオペレーティング システムに解放され、最後に割り当てられたエクステントにファイルが圧縮されます。 これにより、データを移動しなくてもファイル サイズが減少します。

  6. 必要に応じて、 [未使用領域の解放前にファイルを再構成する] をオンにします。 このオプションをオンにする場合は、 [圧縮先のファイル] の値を指定する必要があります。 既定では、このオプションはオフになっています。

    このオプションをオンにすると、ファイル内の未使用領域がオペレーティング システムに解放され、未割り当てページに行の再割り当てを試みます。

  7. 必要に応じて、データベースを圧縮した後に、データベース ファイル内に残す空き領域の最大のパーセンテージを入力します。 0 ~ 99 の値を指定できます。 このオプションは、 [未使用領域の解放前にファイルを再構成する] がオンになっている場合にのみ使用できます。

  8. 必要に応じて、 [データを同じファイル グループの他のファイルに移行してファイルを空にする] をオンにします。

    このオプションをオンにすると、指定したファイルのすべてのデータが同じファイル グループの他のファイルに移動されます。 その後、空になったファイルを削除できます。 このオプションは、EMPTYFILE オプションを指定して DBCC SHRINKFILE を実行するのと同じ効果があります。

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

Transact-SQL の使用

Transact-SQL を使用してデータ ファイルまたはログ ファイルを圧縮する

  1. データベース エンジンに接続します。

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

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、 DBCC SHRINKFILE を使用して、 UserDB データベースに存在する DataFile1 という名前のデータ ファイルのサイズを 7 MB に圧縮します。

USE UserDB;
GO
DBCC SHRINKFILE (DataFile1, 7);
GO