次のようなSQLServer2012に対するクエリを作成しました。
SELECT r.session_id, r.sql_handle, t.text -- more details excluded for brevity
FROM sys.dm_exec_requests r
CROSS APPLY sys.dm_exec_sql_text(r.sql_handle) t
これで、サーバーで何が実行されているかがわかります。このようなクエリを使用すると、必要以上にリソースを消費しているものを見つけることができました。
ただし、(クロスが適用されるため)sql_handle値を持たないsys.dm_exec_requests
のエントリが含まれていないのは気になります。また、返されるリクエストの数(通常は約12)が、負荷に基づいて予想される数よりも少ない場合があることも心配しています。
これは私が見ることができる時間ビューで最も有限のスナップショットであり、SQLは一度に非常に多くのことしか実行できないことを理解しています(またはそう思います)が、私のクエリが欠けているのは何ですか? 「現在、サーバーを何が使用していますか?」
現在のクエリの問題は、その時点で実行されている可能性のあるクエリのみを探していることです。サーバーの状態の全体像を把握するには、SQL Server Profilerを実行するか、sp_who
などの組み込みストアドプロシージャとの接続を確認します。これらのアプローチは、他のDBAによってすでに開発およびテストされているストアドプロシージャを使用するよりも複雑で時間がかかります。
Adam Machanic のsp_whoisactive
という無料のストアドプロシージャをインストールすることをお勧めします。最新バージョン v11.11 は、サーバー上のアクティビティを掘り下げるのに十分なはずです。この手順では、1つまたは2つのDMVを参照するクエリを作成するよりも詳細な情報も得られます。ドキュメントによると、sp_whoisactive
は15個のDMVを使用しています。
どのような種類のexecリクエストにSQLハンドルがありませんか? (sys.dm_exec_requests)
Sql_handle
は、サーバーに送信されるバッチ/クエリのSQLテキストを識別するハッシュ値です。 暗号化されたオブジェクトの場合はテキストをNULLにすることができます これにより、sql_handle
がNULLになる可能性があります