SQL 2008でTempDBが非常に大きく(> 40GB)なり、それを縮小したいと考えています。私は、Management Studioを介してdbccの縮小データベース、dbccの縮小ファイル、および縮小コマンドを使用しました。
次のエラーが発生します。
ページ1:4573184は作業テーブルページであるため移動できませんでした。
DBCC FREEPROCCACHEを実行して縮小ルーチンの1つを再実行することで、危険を回避するためにスペースを取り戻すことができましたが、明らかにこれは理想的ではなく、たぶん少し時間を費やすだけです。
私はDBCC OpenTranを実行しましたが、そこには何もぶらさがっていません。
私がインターネット上で読んだところはどこでもSQL Serverのリサイクルに行き着きます...確かにより良い方法が必要です...誰か?
おかげで、
トム
注:この投稿も役に立つかもしれません:
どのプロセスがその作業テーブルを使用しているのか(そしてそれを安全に強制終了できる)を理解できない場合を除き、検索で既に得られた結果に同意する必要があります。サーバーを循環させると、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が再び必要になったときに、それをリースして、人々を立ち退かせますか?次のいずれかを行う必要があります。
他のいくつかの提案:
SHRINKDATABASE
(自動フラグメントと呼ばれる必要があります)またはUIを使用しないでください。特定のターゲットを絞ったSHRINKFILE
コマンドを記述して、個々のファイルに影響を与えます。私がインターネット上で読んだところはどこでもSQL Serverのリサイクルに行き着きます...確かにより良い方法が必要です...誰か?
いいえ、これは一時的な解決策です。以前に同じ質問を投稿したと思いますが、SQL Serverインスタンスにあるデータベースの合計サイズを教えてください。 tempdbのサイズは、クエリが使用している量によって異なります。あなたがそれを使わない限り、それはそれ自身で成長することはできません。 Aronが共有するリンクは役立ちますが、temdbbを頻繁に使用している場合や、環境のデフォルトの要件である場合は、クエリを調整する必要があります。私はいくつかの環境を見てきました。 200 Gのtempdbは許容されます。これは、クエリがそれだけの量のtempdbスペースを必要としたためです。