web-dev-qa-db-ja.com

TempDBは縮小しません。未処理のトランザクションはありません

SQL 2008でTempDBが非常に大きく(> 40GB)なり、それを縮小したいと考えています。私は、Management Studioを介してdbccの縮小データベース、dbccの縮小ファイル、および縮小コマンドを使用しました。

次のエラーが発生します。

ページ1:4573184は作業テーブルページであるため移動できませんでした。

DBCC FREEPROCCACHEを実行して縮小ルーチンの1つを再実行することで、危険を回避するためにスペースを取り戻すことができましたが、明らかにこれは理想的ではなく、たぶん少し時間を費やすだけです。

私はDBCC OpenTranを実行しましたが、そこには何もぶらさがっていません。

私がインターネット上で読んだところはどこでもSQL Serverのリサイクルに行き着きます...確かにより良い方法が必要です...誰か?

おかげで、

トム

9
user45117

注:この投稿も役に立つかもしれません:

TempDB mdfファイルの問題が増加し続ける

どのプロセスがその作業テーブルを使用しているのか(そしてそれを安全に強制終了できる)を理解できない場合を除き、検索で既に得られた結果に同意する必要があります。サーバーを循環させると、tempdbを圧縮できるはずです。

別の質問では、これを#tempテーブルについて理解することが扱われています。それが作業テーブルに適応できるかどうかはわかりません:

どのセッションがどの一時テーブルを保持しているかを見つける

私はそれについてもブログに書きました(ここでも、#tempテーブル用):

http://sqlperformance.com/2014/05/t-sql-queries/dude-who-owns-that-temp-table

作業テーブルがスナップショット分離/バージョンストアに関連しているとは思いませんが、念のため:

バージョンストアを埋めているトランザクションを検索

また、DBCC OPENTRAN;に依存しないでください-アクティブなトランザクションがあるknowの多くのシナリオを観察しましたが、そうではありませんそこに現れます。また、データベースコンテキストは重要です。トランザクションがアクティブなデータベースは必ずしもtempdbではありません。ここには何が見えますか?何か?

SELECT * FROM sys.dm_tran_active_transactions
  WHERE name = N'worktable';

Tempdbを縮小したら

もちろん、これは恒久的な解決策ではありません。 tempdbを縮小すると、再び大きくなります。これは、毎回このゲームをプレイするのが非常に退屈で退屈な作業になる可能性があります。そして、それが再び成長するなら、その間にその空きスペースをどうするつもりですか? tempdbが再び必要になったときに、それをリースして、人々を立ち退かせますか?次のいずれかを行う必要があります。

  1. 最初にtempdbを異常に大きくしているプロセスを修正します。
  2. Tempdbに十分なスペースを割り当てて、拡張する必要がないようにし、圧縮を停止します(特に一時的な場合のみ。これは無駄な作業です)。

他のいくつかの提案:

  • SHRINKDATABASE(自動フラグメントと呼ばれる必要があります)またはUIを使用しないでください。特定のターゲットを絞ったSHRINKFILEコマンドを記述して、個々のファイルに影響を与えます。
  • Tempdbに複数のファイルを使用することを検討してください(可能な場合は別のストレージに分散できます)。トレースフラグ 1117 (この動作がユーザーデータベースにも影響しない限り)および1118を検討してください。
  • Tempdbの使用率を最小限に抑えるためのヒント:
7
Aaron Bertrand

私がインターネット上で読んだところはどこでもSQL Serverのリサイクルに行き着きます...確かにより良い方法が必要です...誰か?

いいえ、これは一時的な解決策です。以前に同じ質問を投稿したと思いますが、SQL Serverインスタンスにあるデータベースの合計サイズを教えてください。 tempdbのサイズは、クエリが使用している量によって異なります。あなたがそれを使わない限り、それはそれ自身で成長することはできません。 Aronが共有するリンクは役立ちますが、temdbbを頻繁に使用している場合や、環境のデフォルトの要件である場合は、クエリを調整する必要があります。私はいくつかの環境を見てきました。 200 Gのtempdbは許容されます。これは、クエリがそれだけの量のtempdbスペースを必要としたためです。

0
Shanky