web-dev-qa-db-ja.com

65G SQL Serverデータベースは、使用されていないときにtempdbに5.5Gのデータを持っています

65Gの1つの本番データベース(およびReportServer dbs)を備えたSQL Serverインスタンスがあります。 tempdbはサーバーが使用されていないときは5.5G(まあ、実際にはもっと大きいですが、5.5Gが使用されています)です。これは異常だと思います。このスペースがいっぱいになり、解放されない原因を診断するにはどうすればよいですか?

1
Mary Opdahl

非一時的なユーザーオブジェクト

Tempdbに一時的でないユーザーテーブルがある可能性があります。これらは自動的にクリーンアップされません(サーバーが再起動されない限り)。あなたはこのようにそれらをチェックすることができます:

USE tempdb;
GO
SELECT * FROM sys.objects WHERE [type] = 'U';

このスペースを解放するには、DROP TABLEステートメントを使用して、これらのテーブルを手動で削除する必要があります。最初にまだそれらを使用していないことを確認してください????

一時オブジェクトを維持するスリープセッション

別の可能性として、誰かが一時テーブルを作成し、そのセッションがまだアクティブである可能性があります。 Stack Overflowサンプルデータベースを使用して一時テーブルを作成し、セッションを開いたままにしました。

SELECT * INTO #Users FROM dbo.Users;

確認済みのスペース使用量:

screenshot of disk usage report in SSMS

4つのtempdbファイルはすべて、約15 MBのスペースを使用しています。

スリープ中のspidを表示するオプションでsp_WhoIsActiveを確認すると、セッションがまだ開いていることがわかります。

EXEC master.dbo.sp_WhoIsActive @show_sleeping_spids = 2;

screenshot of query results showing the SELECT INTO query with tempdb allocations

Tempdbが割り当てられているセッション、または長時間開いている疑わしいセッションを探します。

SSMSでセッション53のウィンドウを閉じてからsp_WhoIsActiveを再チェックすると、クエリが消えます。そして今度はtempdbのスペース使用量をもう一度確認します。

screenshot of disk usage report in SSMS

「Space Used」が4つのファイルすべてにドロップされていることがわかります。

このように保持されているスペースを解放するには、次のいずれかを行う必要があります。

  • login_nameフィールドで人物を追跡し、セッションを終了するように依頼する、または
  • KILLコマンドを使用してセッションを強制終了します
2
Josh Darnell