現在オフラインです。再接続するためにインターネットの接続を待っています

SQL Server で tempdb データベースを圧縮する方法

中小企業のお客様は、中小企業向けサポートサイトで問題解決コンテンツや学習リソースもご利用ください。
概要
ここでは、tempdb データベースのサイズを前回構成時のサイズよりも小さなサイズに圧縮するための 3 つの方法について説明します。第 1 の方法では、tempdb ファイルのサイズを完全に制御できますが、SQL Server を再起動する必要があります。第 2 の方法は、tempdb 全体を圧縮するもので、いくつかの制限があり、SQL Server の再起動が必要になる場合があります。第 3 の方法では、tempdb の個別のファイルを圧縮できます。後の 2 つの方法では、圧縮処理の間に tempdb データベースで操作が発生しないようにする必要があります。

: SQL Server 2005 を使用している場合も、これらの方法を使用できます。ただし、この手順を実行する場合には Enterprise Manager やクエリ アナライザーの代わりに、SQL Server Management Studio を使用する必要があります。また、2005 の SQL Server Management Studio では、圧縮操作の後で tempdb ファイルのサイズが正しく表示されないことに注意してください。[現在割り当てられている領域] の値は常に sys.master_files DMV から取得されますが、この値は tempdb データベースに対して圧縮操作が行われた後で更新されません。圧縮操作の後に tempdb ファイルの正しいサイズを知るには、Management Studio で次のステートメントを実行してください。
use tempdbselect (size*8) as FileSizeKB from sys.database_files

: SQL Server 2008 にはこの問題 (GUI に正しくないサイズが表示される) はありません。
先頭に戻る

tempdb について

tempdb は一時的なワークスペースです。SQL Server は tempdb を主に以下の用途に使用します。
  • 明示的に作成した一時テーブルの記憶領域
  • クエリの処理中および並べ替え中に作成された中間結果を格納する作業テーブル
  • 静的カーソルの結果セットの格納
SQL Server では、tempdb のトランザクション ログに記録されるのはトランザクションのロールバックに必要な情報のみで、データベースの復旧中にトランザクションの再実行に必要な情報は記録されません。この機能により、tempdb での INSERT ステートメントのパフォーマンスが向上します。また、SQL Server を再起動するたびに tempdb が再作成されるので、トランザクションの再実行に必要な情報の記録は不要です。したがって、tempdb にはロール フォワードまたはロールバックするトランザクションはありません。SQL Server が起動されると、model データベースのコピーを使用して tempdb が再作成され、前回構成時のサイズにリセットされます。

tempdb データベースは必要に応じて自動拡張するように既定で構成されています。したがって、このデータベースは、時間が経過すると予想以上に大きいサイズに拡張されることがあります。SQL Server を再起動しただけでは、tempdb のサイズは前回構成時のサイズにリセットされます。前回構成時のサイズとは、MODIFY FILE オプションを指定した ALTER DATABASE ステートメントや DBCC SHRINKFILE ステートメントなどによるファイル サイズの変更操作によって最後に構成された明示的なサイズです。この資料では、tempdb を前回構成時のサイズよりも小さいサイズに圧縮する 3 つの方法について説明します。

先頭に戻る

tempdb を圧縮する方法 1

この方法では、SQL Server の再起動が必要になります。

  1. SQL Server を停止します。コマンド プロンプトを開き、次のコマンドを入力して SQL Server を起動します。

    sqlservr -c -f

    パラメーター -c および -f を指定すると、tempdb のデータ ファイルが 1 MB で、ログ ファイルが 0.5 MB の最小構成モードで SQL Server が再起動します。

    : SQL Server の名前付きインスタンスを使用する場合、適切なフォルダー (Program Files\Microsoft SQL Server\MSSQL$instance name\Binn) に移動して、-s スイッチ (-s%instance_name%) を使用する必要があります。
  2. クエリ アナライザーを使用して SQL Server に接続し、次の Transact-SQL コマンドを実行します。
    ALTER DATABASE tempdb MODIFY FILE(NAME = 'tempdev', SIZE = target_size_in_MB) --Desired target size for the data fileALTER DATABASE tempdb MODIFY FILE(NAME = 'templog', SIZE = target_size_in_MB)--Desired target size for the log file					
  3. コマンド プロンプト ウィンドウで Ctrl キーを押しながら C キーを押して、SQL Server を停止します。SQL Server をサービスとして再起動し、tempdb.mdf ファイルおよび templog.ldf ファイルのサイズを確認します。
この方法には、tempdb の既定の論理ファイルである tempdev および templog しか操作できないという制限があります。tempdb にファイルが追加されている場合、SQL Server をサービスとして再起動後にそれらのファイルを圧縮できます。すべての tempdb ファイルは起動中に再作成されるため、tempdb ファイルは空で、削除できます。tempdb の追加ファイルを削除するには、REMOVE FILE オプションを指定した ALTER DATABASE コマンドを使用します。

先頭に戻る

tempdb を圧縮する方法 2

DBCC SHRINKDATABASE コマンドを使用して、tempdb データベースを一度に圧縮します。DBCC SHRINKDATABASE コマンドでは、データベースを圧縮した後のデータベース ファイルに残す空き領域を、パラメーター target_percent にパーセンテージで指定します。DBCC SHRINKDATABASE コマンドを使用する場合、SQL Server の再起動が必要になることがあります。

重要: DBCC SHRINKDATABASE コマンドを実行する場合、tempdb データベースで他の処理が行われていないことを確認してください。DBCC SHRINKDATABASE コマンドの実行中に、tempdb を他の処理で使用できないようにするには、SQL Server をシングル ユーザー モードで起動する必要があります。詳細については、この資料の「tempdb の使用中に DBCC SHRINKDATABASE または DBCCSHRINKFILE を実行した場合の影響」を参照してください。
  1. sp_spaceused ストアド プロシージャを使用して、tempdb で現在使用されている領域を確認します。その後、DBCC SHRINKDATABASE のパラメーターで使用する空き領域のパーセンテージを計算で求めます。この計算は、圧縮後に必要なデータベースのサイズに基づいています。

    : 場合によっては、sp_spaceused @updateusage=true を実行して使用されている領域を再計算し、更新されたレポートを取得する必要があります。sp_spaceused ストアド プロシージャの詳細については、SQL Server Books Online を参照してください。

    次の例を参考にしてください。
    tempdb に、サイズが 100 MB のプライマリ データ ファイル (Tempdb.mdf) と 30 MB のログ ファイル (Tempdb.ldf) の 2 つのファイルがあると仮定します。sp_spaceused プロシージャにより、プライマリ データ ファイルに 60 MB のデータが含まれていることが報告されたとします。また、プライマリ データ ファイルを 80 MB に圧縮するとします。圧縮後、データベース ファイル内に残す空き領域のパーセンテージを計算します。80 MB から 60 MB を引き算すると 20 MB になります。20 MB を 80 MB で割り算すると 25% になり、これが target_percent になります。この割合でトランザクション ログ ファイルが圧縮され、圧縮後は、25% つまり 20 MB の空き容量ができます。
  2. クエリ アナライザーを使用して SQL Server に接続し、次の Transact-SQL コマンドを実行します。
    dbcc shrinkdatabase (tempdb, 'target percent') -- This command shrinks the tempdb database as a whole					
tempdb データベースで DBCC SHRINKDATABASE コマンドを使用する際には制限事項があります。データ ファイルとログ ファイルの圧縮後のサイズは、データベースの作成時に指定されたサイズ、または MODIFY FILE オプションを指定した ALTER DATABASE コマンドや DBCC SHRINKFILE コマンドなどによるファイル サイズ変更操作によって最後に明示的に設定されたサイズより、小さいサイズに圧縮することはできません。また、DBCC SHRINKDATABASE コマンドには、現在使用されている領域に依存する target_percentage パラメーターの計算が必要であるという制限事項もあります。

先頭に戻る

tempdb を圧縮する方法 3

tempdb ファイルを個別に圧縮するには、DBCC SHRINKFILE コマンドを使用します。DBCC SHRINKFILE コマンドは、同じデータベースに所属する他のファイルに影響を与えずに、1 つのデータベース ファイルに対して使用できるので、DBCC SHRINKDATABASE コマンドよりも柔軟性があります。DBCC SHRINKFILE コマンドでは、target size パラメーターを指定します。このパラメーターに指定した値がデータベース ファイルに必要な最終サイズになります。

重要: DBCC SHRINKFILE コマンドは、tempdb データベースで他の処理が行われていないときに実行する必要があります。DBCC SHRINKFILE コマンドの実行中に他の処理で tempdb を使用できないようにするには、SQL Server をシングル ユーザー モードで再起動する必要があります。DBCC SHRINKFILE コマンドの詳細については、この資料の「tempdb の使用中に DBCC SHRINKDATABASE または DBCCSHRINKFILE を実行した場合の影響」を参照してください。
  1. プライマリ データ ファイル (tempdb.mdf)、ログ ファイル (templog.ldf)、または tempdb に追加されている他のファイルの必要なサイズを決定します。ファイルで使用されている領域が、圧縮後のサイズ以下であることを確認してください。
  2. クエリ アナライザーで SQL Server に接続し、圧縮が必要な特定のデータベース ファイルに次の Transact-SQL コマンドを実行します。
    use tempdbgodbcc shrinkfile (tempdev, 'target size in MB')go-- this command shrinks the primary data filedbcc shrinkfile (templog, 'target size in MB')go-- this command shrinks the log file, look at the last paragraph.						
DBCC SHRINKFILE コマンドの利点は、ファイル サイズを元のサイズよりも小さくできることです。DBCC SHRINKFILE コマンドは、すべてのデータ ファイルまたはログ ファイルに対して実行できます。DBCC SHRINKFILE コマンドには、データベースを model データベースのサイズよりも小さくできないという制限があります。

SQL Server 7.0 では、トランザクション ログの圧縮は遅延操作で、データベースでの圧縮操作を容易にするため、ログの切り捨てとバックアップを実行する必要があります。ただし、tempdbtrunc log on chkpt オプションが既定でオンに設定されているので、tempdb データベースでログの切り捨てを実行する必要はありません。SQL Server 7.0 でデータベース トランザクション ログを圧縮する方法の関連情報を参照するには、以下のサポート技術情報番号をクリックしてください。
256650 [INF] SQL Server 7.0 トランザクション ログを圧縮する方法

先頭に戻る

tempdb の使用中に DBCC SHRINKDATABASE または DBCCSHRINKFILE を実行した場合の影響

tempdb が使用されているときに DBCC SHRINKDATABASE コマンドまたは DBCC SHRINKFILE コマンドを使用して圧縮すると、以下のような複数の一貫性エラーが表示され、圧縮操作に失敗することがあります。
サーバー: メッセージ 2501、レベル 16、状態 1、行 1 '1525580473' という名前のテーブルが見つかりませんでした。sysobjects を調べてください。
または
サーバー: メッセージ 8909、レベル 16、状態 1、行 0 テーブル エラー: オブジェクト ID 1、インデックス ID 0、ページ ID %S_PGID。ページ ヘッダー内のページ ID = %S_PGID。
エラー 2501 が表示された場合、tempdb が破損していないこともありますが、このエラーが原因で圧縮操作に失敗します。一方、エラー 8909 が表示された場合は、tempdb データベースが破損している可能性があります。SQL Server を再起動して tempdb を再作成し、一貫性エラーをクリーン アップします。ただし、エラー 8909 など、データが物理的に破損していることを示すエラー (入出力のサブシステムの問題を含む) の原因は他にもあり得ることに注意してください。

先頭に戻る

関連情報

SQL Server Books Online のトピック「DBCC SHRINKFILE」、「DBCC SHRINKDATABASE」を参照してください。

先頭に戻る
プロパティ

文書番号:307487 - 最終更新日: 07/16/2013 01:22:00 - リビジョン: 7.1

Microsoft SQL Server 2000 Standard Edition, Microsoft SQL Server 7.0 Standard Edition, Microsoft SQL Server 2000 64-bit Edition, Microsoft SQL Server 2005 Standard Edition, Microsoft SQL Server 2005 Developer Edition, Microsoft SQL Server 2005 Enterprise Edition, Microsoft SQL Server 2005 Workgroup Edition

  • kbsqlmanagementtools kbhowtomaster KB307487
フィードバック