web-dev-qa-db-ja.com

DMVからセッションとロックを取得するクエリを同期する

データベースで何が起こっているかを確認したいときに実行するSQLスクリプトがあります。スクリプトにはDMVから情報を返すクエリがたくさんありますが、私が最もよく使用するのは「リクエスト」( sys.dm_exec_requestssys.dm_exec_sessions など)と「ロック」の2つです。 "( sys.dm_tran_locks )。出力はSQLServerアクティビティモニターに似ていますが、より多くの情報が表示されます。

リクエストがリクエストクエリに表示されることがありますが、ロッククエリが実行される前に完了します。たとえば、RequestsクエリはSPID 51がロックリソースを待機していることを示している場合がありますが、LocksクエリにはSPID 51のロック情報が含まれていません(wait_typewait_resource列とsys.dm_exec_requests列について知っています)。

これらの2つの別々のクエリがデータベースアクティビティの一貫したスナップショットを表示することを保証する方法はありますか?

商用データベース監視アプリケーションでも同じ問題が発生するはずです。

これらのクエリをSERIALIZABLE同時実行で実行し、DMV結合にロックのヒントを追加してみましたが、クエリはロックを取得しません。とにかく本番環境ではこれをやりたくありません。

私がこれまでに持っている最高のアイデアは次のとおりです。

  1. これらのクエリを異なるセッションから同時に実行します。

  2. リクエストを結合し、1つのクエリで一緒にロックします。一度に100,000を超えるロックを確認したことを考えると、この結合は多くの重複した要求とセッションデータを返しますが、機能する可能性があります。

拡張イベントがうまく機能するかどうかを知るのに十分な知識がありません。イベントのペアリングでしょうか。

2
Paul Williams

ありえない。これらのDMVは、自己整合性の保証すら提供しません。たとえば、リソースが、同じ実行で、同じ結果セットで、異なる相互に排他的状態で表示される可能性があります。このようなDMVがスキャン中にデータを「安定化」するために必要な手順を実行すると、パフォーマンスが低下します(sys.dm_tran_locksのスキャンが進行している間、すべてのロックが所定の位置でフリーズすることを想像してください)。

拡張イベントははるかに優れた画像を提供しますが、明らかにeventsの画像であり、状態の画像ではありません。理論的には、初期状態を知っている一連のイベントから状態を再構築し、状態ダンプ(DMV)から取得するのと同じ画像を実現することは常に可能ですが、それは理論にすぎません...

6
Remus Rusanu