データベース サーバー上の SQL Server プロセスによる 100% の CPU 使用率を解決しようとしています。調査中に、ストアド プロシージャが最も多くの作業時間を取っているという事実に出くわしました。
次の dmv のクエリでは、最も時間がかかるクエリを見つけます。
SELECT TOP 20 st.text
,st.dbid
,st.objectid
,qs.total_worker_time
,qs.last_worker_time
,qp.query_plan
FROM sys.dm_exec_query_stats qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
CROSS APPLY sys.dm_exec_query_plan(qs.plan_handle) qp
ORDER BY qs.total_worker_time DESC
それらのほとんどはストアド プロシージャです。奇妙なことは、これらすべてのストアド プロシージャが異なるテーブルにクエリを実行していることです。それでも、CPU、読み取り、期間がトップのクエリのプロファイラーを見ると、ストアド プロシージャはトップに表示されませんが、ワーカー時間が最も長いトップです。
なぜこれが起こっているのでしょうか?
==編集== アプリケーションは、実際にはストアド プロシージャよりもアドホック クエリを使用します。これらの手順の一部は、アドホック クエリを使用するように移行されます。問題は、これらのプロシージャは、CPU を集中的に使用する他のクエリほど頻繁に呼び出されず、非常に頻繁に呼び出されることです。また、単純な select a,b,c from tbl where id=@id を実行するストアド プロシージャは、where に複数の結合、ユーザー定義関数を持つクエリよりも合計ワーカー時間が長くなるというのは奇妙に思えます。句、並べ替え、row_number があり、単純なクエリは 20000 レコードのテーブルをクエリしますが、複雑なクエリは 200,000 レコードを超えるテーブルを対象としています。