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


9

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

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

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

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

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

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

おかげで、

トム

回答:


7

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

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

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

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

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

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

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

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

バージョンストアを埋めているトランザクションを見つける

また、依存しないでください。アクティブなトランザクションがあることがわかっていても、そこに表示されないというDBCC OPENTRAN;多くのシナリオを観察しました。また、データベースコンテキストは重要です。トランザクションがアクティブなデータベースは必ずしも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の使用率を最小限に抑えるためのヒント:

1
SELECT * FROM sys.dm_tran_active_transactions WHERE name = N'worktable '; 同じ日付(7/10/14)の6行をすべて返します。transaction_idはSPIDを表しますか?
user45117 2014

いいえ、transaction_idはSPIDではありません。トランザクションが実際にアクティブである(そしてそれらがシステムトランザクションではない)場合は、sys.dm_tran_session_transactionsのsession_idと照合できるはずです。いずれにせよ、これはDBCC SHRINKFILEから取得したメッセージですか?ALTER DATABASE ... MODIFY FILEはどうですか?また、プロシージャキャッシュをクリアすると問題が解決した理由がわかりません。プロシージャキャッシュはtempdbではなくメモリ内にあります...
Aaron Bertrand

メッセージはDBCC SHRINKDATABASEから送信されました。私はALTER DATABASE ... MODIFY FILE ...を試していません...それは次になります。プロシージャキャッシュをクリアすると、tempdbが約10%縮小され、4 GBのドライブ領域が返されました。これらのtransaction_idをsys.dm_tran_active_transactionsからsys.dm_tran_session_transactions内の何かにリンクできませんでした
user45117

1
プロシージャキャッシュのクリアは、tempdbの "許可"とは、思ったよりも関連性が低いと思います。偶然が常に起こります。
アーロンバートランド

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.