SQL クエリを実行する .NET クライアント アプリケーションがあり、そのクエリが ADO.NET によってタイムアウトになることがあります。タイムアウトになると、クエリ プランが dm_exec_query_stats にキャッシュされていることがわかりません。クエリが完了すると、プランがキャッシュされます。
アプリケーションの例外ハンドラで、タイムアウトになった特定のクラスのクエリのクエリ プランをプログラムでキャプチャしたいと考えています。これはトラブルシューティングに役立ちます。これは可能ですか?タイムアウトの可能性がある各クエリは一意の名前を持つテーブルを参照するため、クエリ テキストをスキャンして適切なプランを見つけることができます。
私は、私の例外ハンドラーで、実行できることを望んでいました:
SELECT TOP 1 p.query_plan, t.text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text (qs.plan_handle) AS t
CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) AS p
WHERE t.text LIKE '%UNIQUETABLE%'
ORDER BY last_execution_time DESC;
しかし、これには探しているクエリが含まれていません。おそらくタイムアウトしたためでしょうか?
中止されたクエリを開始するために使用されたクエリ プランを取得することは可能ですか?
(実行される SQL は動的です。ストアド プロシージャを使用すると楽になりますが、残念ながらそれは利用できません!)