データベースの圧縮

適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

この記事では、SQL Server Management Studio または Transact-SQL のオブジェクト エクスプローラーを使用して、SQL Server でデータベースを圧縮する方法について説明します。

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

制限事項と制約事項

  • データベースは、そのデータベースの最小サイズより小さくすることはできません。 最小サイズは、データベースが最初に作成されたときに指定されたサイズか、DBCC SHRINKFILE などのファイル サイズ変更操作によって最後に明示的に設定されたサイズのいずれかになります。 たとえば、作成時にサイズを 10 MB に指定したデータベースが 100 MB まで拡張した場合、データベース内のすべてのデータを削除したとしても、縮小できる限界は 10 MB までです。

  • データベースのバックアップ中、データベースを圧縮することはできません。 逆に、データベースの圧縮操作の進行中、データベースをバックアップすることはできません。

推奨事項

  • データベース内にある現在の空き (未割り当て) 領域の大きさを確認します。 詳細については、「 データベースのデータ領域とログ領域情報の表示」をご覧ください。

  • データベースを圧縮する場合は次のことを考慮してください。

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

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

    • 圧縮操作では、データベース内のインデックスの断片化状態は保持されず、一般に、断片化の程度が大きくなります。 この理由からも、データベースを繰り返し圧縮することはお勧めできません。

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

アクセス許可

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

解説

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

Azure SQL データベース固有のファイル管理と縮小操作については、「Azure SQL Database でデータベースのファイル領域を管理する」を参照してください。

SQL Server Management Studio を使用する

適用対象: SQL Server Azure SQL Managed Instance

データベースの圧縮

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

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

  3. [タスク] をポイントし、[圧縮] をポイントし、[データベース] を選択します。

    • データベース

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

    • [現在割り当てられている領域]

      選択されているデータベースの使用済み領域と未使用領域の合計を表示します。

    • [使用可能な空き領域]

      選択されているデータベースのログ ファイルおよびデータ ファイル内の空き領域の合計を表示します。

    • [未使用領域の解放前にファイルを再構成する]

      このオプションをオンにすることは、目的のパーセント オプションを指定して DBCC SHRINKDATABASE を実行することと同じです。 このオプションをオフにすると、TRUNCATEONLY オプションを使用して DBCC SHRINKDATABASE を実行するのと同じ効果があります。 既定では、ダイアログが開いたときに、このオプションはオフに設定されます。 このオプションをオンにした場合、ユーザーは目的のパーセント オプションを指定する必要があります。

    • [圧縮後のファイルの最大空き領域]

      データベースを圧縮した後に、データベース ファイル内に残す空き領域の最大パーセンテージを入力します。 0 ~ 99 の値を指定できます。

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

Transact-SQL の使用

データベースの圧縮

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

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

  3. 次の例をコピーしてクエリ ウィンドウに貼り付け、 [実行] を選択します。 この例では、DBCC SHRINKDATABASE を使用して、UserDB データベース内のデータとログのファイル サイズを縮小し、データベースの空き領域が 10 % になるようにします。

DBCC SHRINKDATABASE (UserDB, 10);
GO

データベースを圧縮した後

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