0

データベース サーバー上の 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 レコードを超えるテーブルを対象としています。

4

1 に答える 1

1

そのストアド プロシージャで何をしているか、テーブルやインデックスなどをどのように調整しているかによって異なります。

たとえば、カーソルのようなループを使用してストアド プロシージャを作成すると、CPU 使用率が最大になります。インデックスを設定せず、別の結合などを使用して選択を使用している場合。CPUが過負荷になります。

したがって、データベースをどのように使用するかによって異なります。

いくつかのヒント:

  1. ほとんどの場合、ストアド プロシージャを作成することをお勧めします。
  2. ストアド プロシージャを作成するときは、実行計画を使用して実行し、いくつかの提案を取得します。
  3. テーブルに多数のレコード (100 万または 200 万を超える) がある場合は、インデックス ビューの作成を検討してください。
  4. 必要な場合にのみ更新または削除を行います。場合によっては、レコードのみを挿入し、ジョブを毎日または毎週実行して、不要なレコードを更新または削除する方がよい場合があります。(場合による)
于 2012-04-04T19:16:22.357 に答える