web-dev-qa-db-ja.com

TempDBバージョンストアのクリーンアップ

バージョンストアは、最も古いアクティブなトランザクションよりも古いバージョンのみをクリーンアップします。 質問:最も古いトランザクションデータベースは固有ですか、それともSQL Serverはデータベースに関係なくすべてのバージョンを保持しますか?

バックストーリー-約40のデータベースをホストするSQL Server 2005 SP4 Enterprise。 TempDBは現在102 GB、バージョンストアは約98 GBです。データベースインスタンスでホストされているアプリケーションの1つに、sys.dm ... database_transactionsに基づいて40日経過したオープントランザクションがあります。先月、2つの別々の大きなデータベースが非常に頻繁に使用され、TempDBの成長がこれらの操作と一致していることがわかりました。ある程度の成長が見込まれました。成長し続けるとは思っていませんでした。 質問:3つの独立したデータベースに40日前の接続があり、表示されているため、これらの2つの個別のデータベースからTempDBのバージョンストアにバージョンが保存されていますか開いているtransaction_state?

Perfmonカウンター:バージョンストアは、今朝私が追跡した数時間で継続的に増加しています。バージョン生成レートAVGは約30 kb/s、バージョンクリーンアップレートは0 kb/sです。

TempDBには十分な空き容量があり、すべてのユーザーデータベースには合計約300 GBのデータファイルがあります。TempDBは、最後の再起動以降、8つのデータファイルごとに1日あたり平均350 MB増加しています。この動作は異常であり、調査により大きなバージョンストアが明らかになりました

長期的なコメントセクションを持たないように、質問にコメントするための回答:

Q:tempdbで自動拡張するのはなぜですか? A:TempDBは、ほとんどの場合に適切であると判断したサイズで初期化するように設定されています。異常なデータベースアクティビティを処理するために、自動拡張を許可します。自動成長も監視します。

Q:トランザクションがアクティブであり、アクティブな接続だけではないことをどのようにして知るのですか? A:transaction_stateは、sys.dm_tran_active_snapshot_database_transactionsなどでアクティブと表示されます。アクティビティモニターは、各接続に1つのオープントランザクションがあると言います。

Q:なぜあなたのアプリはそんなにバカなのですか? A:そのサードパーティ。このインスタンスの多くの1つ。動作が異常なのか、簡単に修正できるのかわかりません。

[〜#〜]解像度[〜#〜]

開いているトランザクションwhereがバージョンストアのクリーンアップを妨げているため、Jonは正しかった。バージョンストアのクリーンアップは、データベースとは無関係に行われる。問題のトランザクションを閉じると、バージョンストアのクリーンアップを開始できました。理由の背後にある現在の理論はジョン・セイゲルによるものです

バージョンストアは、インスタンス全体で最も古いアクティブなトランザクションに基づいてバージョンをクリアすることしかできません。これにより、複数のデータベースで同時にトランザクションレベルのスナップショット分離を使用できます。

誰かが確実に知っているか、これを証明できる場合は、ください

参照されている質問: find-transactions-that-are-filling-up-the-version-store

参考資料:
TempDB 2005 WP
TeratraxチューニングtempDB
Idera Demystify Tempdb

7
Cougar9000

(注:これは100%確実な答えではありません。参照もありません。別の方法で証明できるかどうかをお知らせください。)

バージョンストアはinstance全体で最も古いアクティブトランザクションに基づくバージョンのみをクリアして、複数のデータベースで同時にトランザクションレベルのスナップショット分離の使用をサポートできます。あるデータベース内の「古い」バージョンが別のデータベースのスナップショットトランザクションの途中でクリアされた場合、それは単に機能しません。

したがって、非常に古いオープントランザクションがある場合、そのトランザクションがコミットまたはロールバックするまで、バージョンストアはクリアできません。

5
Jon Seigel

最も古いトランザクションデータベースは固有ですか、それともSQL Serverはデータベースに関係なく、古いトランザクションがまだアクティブである場合、すべてのバージョンを保持しますか?

SQL Serverは、mightが必要なすべての行バージョンを確実に保持します。

  • バージョンストアは、インスタンス上のすべてのデータベース間で共有されます。
  • バージョンストアは、いくつかの「追加のみ」のストレージユニット(ASU)で構成されています。
  • 必要に応じて、新しいASUが毎分作成されます。
  • 行バージョンが生成されない場合、新しいASUは作成されません。
  • 現在のASUは、開始時にトランザクションに関連付けられています。
  • トランザクションは、完了するまで、行バージョンを同じASUに書き込み続けます。
  • ASUには通常、多くのセッション、データベース、テーブル、インデックスからの行バージョンが含まれます。
  • 個々の行バージョンは削除されません-完全なASUのみが削除されます。
  • ASUが削除されるのは、SQL Serverが不要になった場合保証だけです。
  • ASUクリーンアップは、毎分起動するバックグラウンドスレッドによって実行されます。

その最後のポイントを拡張すると、ASUは次の場合にのみ削除できます。

  1. そのASUをターゲットとするすべてのトランザクションが完了しました。
  2. そのASUからのバージョンを必要とする可能性のあるすべてのトランザクションが完了しました。
  3. 以前のASUはすべて削除されました。

詳細については、次のリソースを参照してください。

行のバージョン管理リソースの使用法-MSDN
SQL Server 2005(Wordドキュメント)でtempdbを操作する

SQL ServerストレージエンジンチームのSunil Argawalによる一連のブログ記事:

バージョンストアの基本
バージョンストアの論理構造
バージョンストアの増加と古いバージョンの削除

4
Paul White 9