適用対象: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が最後に構成されたサイズにリセットされます。 構成済みのサイズは、ALTER DATABASE オプションを使用したMODIFY FILE、DBCC SHRINKFILEまたはDBCC SHRINKDATABASEステートメントなど、ファイル サイズ変更操作を使用して設定した最後の明示的なサイズです。 そのため、異なる値を使用する必要がある場合や、大規模な tempdb データベースを直ちに解決する必要がある場合を除き、サイズが減少するまで SQL Server サービスの次回の再起動を待つことができます。
tempdb アクティビティの進行中は、tempdb を圧縮できます。 ただし、ブロック、デッドロック状態など、その他のエラーが発生し、圧縮が完了しなくなる可能性があります。
tempdbの縮小が成功することを確認するには、サーバーがシングル ユーザー モードの間、またはすべてのtempdbアクティビティを停止するときに、この操作を実行します。
SQL Server では、トランザクション をロールバックするのに十分な情報 のみが tempdb トランザクション ログに記録されますが、データベースの復旧中にトランザクションを再実行することはできません。 この機能により、INSERT の tempdb ステートメントのパフォーマンスが向上します。 さらに、SQL Server を再起動するたびに tempdb が再作成されるため、トランザクションをやり直すために情報をログに記録する必要はありません。 そのため、ロール フォワードまたはロールバックするトランザクションはありません。
tempdb の管理と監視の詳細については、「容量計画とtempdb の使用の監視」を参照してください。
ALTER DATABASE コマンドを使用する
注
このコマンドは、既定の tempdb 論理ファイル tempdev および templogでのみ機能します。
tempdbにさらにファイルを追加する場合は、サービスとして SQL Server を再起動した後に圧縮できます。 すべての tempdb ファイルは起動時に再作成されます。 ただし、これらのファイルは空であり、削除できます。
tempdbで追加のファイルを削除するには、ALTER DATABASE オプションを指定して REMOVE FILE コマンドを使用します。
この方法では、SQL Server を再起動する必要があります。
注
SQLcmd、SQL Server Management Studio (SSMS)、Visual Studio Code 用の MSSQL 拡張機能など、使い慣れた SQL Server クライアント ツールを使用して、SQL Server のインスタンスに接続できます。
SQL Server を停止します。
コマンド プロンプトで、最小構成モードでインスタンスを起動します。 これを行うには、次の手順を実行します。
コマンド プロンプトで、SQL Server がインストールされているフォルダーに移動します (次の例で
<VersionNumber>および<InstanceName>に置き換えます)。cd C:\Program Files\Microsoft SQL Server\MSSQL<VersionNumber>.<InstanceName>\MSSQL\Binnインスタンスが SQL Server の名前付きインスタンスの場合は、次のコマンドを実行します (次の例で
<InstanceName>を置き換えます)。sqlservr.exe -s <InstanceName> -c -f -mSQLCMDインスタンスが SQL Server の既定のインスタンスである場合は、次のコマンドを実行します。
sqlservr -c -f -mSQLCMD注
-cおよび-fパラメーターを指定すると、SQL Server は、データ ファイル用にtempdb1 MB サイズ、ログ ファイル用に 0.5 MB の最小構成モードで起動します。 この-mSQLCMDパラメーターは、sqlcmd 以外のアプリケーションがシングル ユーザー接続を引き継ぐのを防ぎます。
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>);SQL Server を停止します。 これを行うには、コマンド プロンプト ウィンドウで
Ctrl+Cを押し、サービスとして SQL Server を再起動してから、tempdb.mdfファイルとtemplog.ldfファイルのサイズを確認します。
DBCC SHRINKDATABASE コマンドを使用する
DBCC SHRINKDATABASE は、 target_percent パラメーターを受け取ります。 このパラメーターは、データベースの圧縮後にデータベース ファイルに残す空き領域の割合を設定します。
DBCC SHRINKDATABASEを使用する場合は、SQL Server の再起動が必要になる場合があります。
sp_spaceusedストアド プロシージャを使用して、tempdbで現在使用されている領域を確認します。 次に、DBCC SHRINKDATABASEのパラメーターとして使用する空き領域の割合を計算します。 この計算は、目的のデータベース サイズに基づいています。注
場合によっては、
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 の空き領域が残ります。次の 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 SHRINKFILE は、 target_size パラメーターを受け取ります。 このパラメーターは、データベース ファイルの最終的なサイズを設定します。
プライマリ データ ファイル (
tempdb.mdf)、ログ ファイル (templog.ldf)、およびtempdbに追加する追加ファイルの希望するサイズを決定します 。 ファイル内の使用領域が目的のターゲット サイズ以下であることを確認します。SSMS、Visual Studio Code、または 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 メッセージが返されますが、圧縮操作は失敗しません。