tempdb データベースを圧縮する

適用対象: SQL Server Azure SQL Managed Instance

この記事では、SQL Server でデータベースを圧縮 tempdb するために使用できるさまざまな方法について説明します。

tempdb のサイズを変更するには、次のいずれかの方法を使用できます。 この記事では、最初の 3 つのオプションについて説明します。 SQL Server Management Studio (SSMS) を使用する場合は、「データベースの圧縮」の手順に従います。

メソッド 再起動が必要です。 詳細
ALTER DATABASE はい 既定 tempdb のファイル (tempdev および templog) のサイズを完全に制御します。
DBCC SHRINKDATABASE いいえ データベース レベルで動作します。
DBCC SHRINKFILE いいえ 個々のファイルを圧縮できます。
SQL Server Management Studio いいえ グラフィカル ユーザー インターフェイスを使用してデータベース ファイルを圧縮します。

解説

既定では、 tempdb データベースは必要に応じて自動拡張するように構成されます。 このため、このデータベースは想定外に大きくなり、目的のサイズよりも大きくなる可能性があります。 tempdb データベース サイズを大きくしても、SQL Server のパフォーマンスに悪影響はありません。

SQL Server が起動すると、tempdb データベースのコピーを使用して model が 再作成され、tempdb は最後に構成されたサイズにリセットされます。 構成されたサイズは、MODIFY FILE オプションや DBCC SHRINKFILE または DBCC SHRINKDATABASE のステートメントを使用するなど、ALTER DATABASEファイル サイズ変更操作によって最後に明示的に設定されたサイズのいずれかになります。 そのため、異なる値を使用する必要がある場合や、大規模な tempdb データベースに対して直ちに解決する必要がない限り、サイズが小さくなるまで SQL Server サービスの次の再起動を待つことができます。

tempdb アクティビティの進行中は、tempdb を圧縮できます。 ただし、ブロック、デッドロック状態など、その他のエラーが発生し、圧縮が完了しなくなる可能性があります。 このため、tempdb の圧縮を確実に成功させるには、サーバーがシングルユーザー モードであるか、すべての tempdb アクティビティを停止しているときに圧縮を実行することをお勧めします。

SQL Server では、トランザクション をロールバックするのに十分な情報 のみが tempdb トランザクション ログに記録されますが、データベースの復旧中にトランザクションを再実行することはできません。 この機能により、INSERTtempdb ステートメントのパフォーマンスが向上します。 さらに、SQL Server を再起動するたびに tempdb が再作成されるため、トランザクションをやり直すために情報をログに記録する必要はありません。 そのため、ロール フォワードまたはロールバックするトランザクションはありません。

tempdb の管理と監視の詳細については、「容量計画tempdb の使用の監視」を参照してください。

ALTER DATABASE コマンドを使用する

Note

このコマンドは、既定 tempdb の論理ファイル tempdevtemplog に対してのみ動作します。 さらにファイルが tempdb に追加された場合は、サービスとして SQL Server を再起動した後で圧縮できます。 すべての tempdb ファイルは起動時に再作成されます。 ただし、これらは空であり、削除できます。 tempdb のその他のファイルを削除するには、ALTER DATABASE オプションを指定して、REMOVE FILE コマンドを使用します。

この方法では、SQL Server を再起動する必要があります。

  1. SQL Server を停止します。

  2. コマンド プロンプトで、最小構成モードでインスタンスを起動します。 これを行うには、次の手順を実行します。

    1. コマンド プロンプトで、SQL Server がインストールされているフォルダーに移動します (次の例で<VersionNumber> および <InstanceName> に置き換えます)。

      cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binn
      
    2. インスタンスが SQL Server の名前付きインスタンスの場合は、次のコマンドを実行します (次の例で <InstanceName> を置き換えます)。

      sqlservr.exe -s <InstanceName> -c -f -mSQLCMD
      
    3. インスタンスが SQL Server の既定のインスタンスである場合は、次のコマンドを実行します。

      sqlservr -c -f -mSQLCMD
      

      Note

      -c および -f パラメーターを指定すると、SQL Server は、データ ファイル用に tempdb 1 MB サイズ、ログ ファイル用に 0.5 MB の最小構成モードで起動します。 この -mSQLCMD パラメーターは、sqlcmd 以外のアプリケーションがシングル ユーザー接続を引き継ぐのを防ぎます。

  3. sqlcmd で SQL Server インスタンスに接続し、次の Transact-SQL (T-SQL) スクリプトを実行します。 <target_size_in_MB> を目的のサイズに置き換えます。

    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'tempdev', SIZE = <target_size_in_MB>);
    
    ALTER DATABASE tempdb MODIFY FILE
    (NAME = 'templog', SIZE = <target_size_in_MB>);
    
  4. SQL Server を停止します。 これを行うには、Ctrl+C コマンド プロンプト ウィンドウを押し、サービスとして SQL Server を再起動し、tempdb.mdftemplog.ldf ファイルのサイズを確認します。

DBCC SHRINKDATABASE コマンドを使用する

DBCC SHRINKDATABASE はパラメーター target_percentを受け取ります。 データベースを圧縮した後、データベース ファイル内に残す空き領域のパーセンテージを指定します。 DBCC SHRINKDATABASE を使用する場合は、SQL Server を再起動する必要がある場合があります。

  1. tempdb ストアド プロシージャを使用して、現在 sp_spaceused で使用されている領域を決定します。 次に、 DBCC SHRINKDATABASE のパラメーターとして使用するために残っている空き容量の割合を計算します。 この計算は、目的のデータベース サイズに基づいています。

    Note

    場合によっては、使用されている領域を再計算し、更新されたレポートを取得するために sp_spaceused @updateusage = true を実行する必要があります。 詳しくは、「sp_spaceused」を参照してください。

    次の例を確認してください。

    tempdb に、1,024 MB のプライマリ データ ファイル (tempdb.mdf) と 360 MB のログ ファイル (tempdb.ldf) の 2 つのファイルがあるとします。 プライマリ データ ファイルに 600 MB のデータが含まれているとの sp_spaceused 報告があったと仮定します。 また、プライマリ データ ファイルを 800 MB に圧縮するとします。 圧縮後に残った空き領域の必要な割合を計算します。800 MB から 600 MB = 200 MB です。 次に、200 MB を 800 MB で除算し、25%が target_percent になります。 トランザクション ログ ファイルは適宜圧縮され、データベースの圧縮後に 25% または 200 MB の空き領域が残ります。

  2. SSMS、Azure Data Studio、または sqlcmd を使用して SQL Server に接続し、次の Transact-SQL コマンドを実行します。 <target_percent> を目的の割合に置き換えます。

    DBCC SHRINKDATABASE (tempdb, '<target_percent>');
    

DBCC SHRINKDATABASE におけるtempdb このコマンドには制限があります。 データ ファイルとログ ファイルのターゲット サイズは、データベースの作成時に指定されたサイズより小さくすることはできません。また、ALTER DATABASE オプションを使用する MODIFY FILE など、ファイル サイズを変更する操作を使用して明示的に設定された最後のサイズよりも小さくすることはできません。 DBCC SHRINKDATABASE のもう 1 つの制限事項は、target_percentage パラメーターの計算と、使用されている現在の領域に対する暗黙的な依存関係です。

DBCC SHRINKFILE コマンドを使用する

この DBCC SHRINKFILE コマンドを使用して、個々の tempdb のファイルを圧縮します。 DBCC SHRINKFILE は、同じデータベースに属する他のファイルに影響を与えることなく、単一のデータベース ファイルで使用できるためよりも DBCC SHRINKDATABASE 柔軟性が高くなります。 DBCC SHRINKFILEtarget_size パラメーターを受け取ります。 これは、データベース ファイルの最終的なサイズです。

  1. プライマリ データ ファイル (tempdb.mdf)、ログ ファイル (templog.ldf)、および tempdb に追加する追加ファイルの希望するサイズを決定します 。 ファイルで使用される領域が目的のターゲット サイズ以下であることを確認します。

  2. SSMS、Azure Data Studio、または sqlcmd を使用して SQL Server に接続し、圧縮する特定のデータベース ファイルに対して次の Transact-SQL コマンドを実行します。 <target_size_in_MB> を目的のサイズに置き換えます。

    USE tempdb;
    GO
    
    -- This command shrinks the primary data file
    DBCC SHRINKFILE (tempdev, '<target_size_in_MB>');
    GO
    
    -- This command shrinks the log file, examine the last paragraph.
    DBCC SHRINKFILE (templog, '<target_size_in_MB>');
    GO
    

DBCC SHRINKFILE の利点は、ファイルのサイズを元のサイズよりも小さいサイズに縮小できることです。 任意のデータ ファイルまたはログ ファイルでも DBCC SHRINKFILE を発行できます。 データベースを データベースのサイズ model より小さくすることはできません。

圧縮操作を実行するときのエラー 8909

tempdb を使用している場合、および DBCC SHRINKDATABASE または DBCC SHRINKFILE コマンドを使用して圧縮しようとする場合、使用している SQL Server のバージョンに応じて、次のようなメッセージが表示されることがあります。

Server: Msg 8909, Level 16, State 1, Line 1 Table error: Object ID 0, index ID -1, partition ID 0, alloc unit ID 0 (type Unknown), page ID (6:8040) contains an incorrect page ID in its page header. The PageId in the page header = (0:0).

このエラーは、tempdb の実際の破損を示すものではありません. ただし、エラー 8909 などの物理データ破損エラーの他の理由があり、その理由には I/O サブシステムの問題が含まれる場合があります。 そのため、圧縮操作の外部でエラーが発生した場合は、より多くの調査を行う必要があります。

圧縮操作を実行しているアプリケーションまたはユーザーに 8909 メッセージが返されますが、圧縮操作は失敗しません。