2012-04-25 9 views
11

SQL Server 2008がインストールされたWindows 2008 R2サーバーがあります。そのサーバーには、SQLサーバーデータベースを持つ複数の.netサイトがあります。SQL Server 2008高いCPU使用率

現在、平均CPU使用率は95%ですが、SQL Serverはその使用量の大部分を占めています。

私はそれを担当するサイトを特定したいと思いますので、optmizeまたは別のサーバーに移動することができます。しかし、私はこれを見る直接的な方法を見つけられませんでした。私は見つけることができる場合

私が見てきた:

  • 最もCPUに集中的なクエリ
  • CPU集中型の問合せ

一つのことに責任があるプロセスを取得しているデータベース同じデータベースを使用する複数のサイトと「cron」があることも複雑です。だから私はデータベースを特定すると、サイト/ cronがそれを担当しているかのヒントを得る必要があります。

この問題は、私たちのサイトは本当に遅い作っているように私は本当にあなたがのDMVを使用してコストのかかるクエリ(およびそれらが関連付けられているデータベース)を識別することができます...

おかげ

答えて

27

をこの上の任意の助けをいただければ幸いです、例えばfrom this TechNet article

SELECT TOP 50 
[Average CPU used] = total_worker_time/qs.execution_count, 
[Total CPU used] = total_worker_time, 
[Execution count] = qs.execution_count, 
[Individual Query] = SUBSTRING (qt.text,qs.statement_start_offset/2, 
     (CASE WHEN qs.statement_end_offset = -1 
      THEN LEN(CONVERT(NVARCHAR(MAX), qt.text)) * 2 
      ELSE qs.statement_end_offset END - 
qs.statement_start_offset)/2) 
,[Parent Query] = qt.text 
,DatabaseName = DB_NAME(qt.dbid) 
FROM sys.dm_exec_query_stats qs 
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) as qt 
ORDER BY [Average CPU used] DESC; 

これらは重い打者クエリについて教えてくれますが、残念ながらそれは個別にCPUの小さなビットが、総額の大きいビットを使用している小さなクエリの非常に高いボリュームを持っている可能性があるデータベースを特定しません。

WITH DB_CPU_Stats 
AS 
(SELECT DatabaseID, DB_Name(DatabaseID) AS [DatabaseName], 
    SUM(total_worker_time) AS [CPU_Time_Ms] 
FROM sys.dm_exec_query_stats AS qs 
CROSS APPLY (SELECT CONVERT(int, value) AS [DatabaseID] 
       FROM sys.dm_exec_plan_attributes(qs.plan_handle) 
       WHERE attribute = N'dbid') AS F_DB 
GROUP BY DatabaseID) 
SELECT ROW_NUMBER() OVER(ORDER BY [CPU_Time_Ms] DESC) AS [row_num], 
     DatabaseName, [CPU_Time_Ms], 
     CAST([CPU_Time_Ms] * 1.0/SUM([CPU_Time_Ms]) 
     OVER() * 100.0 AS DECIMAL(5, 2)) AS [CPUPercent] 
FROM DB_CPU_Stats 
WHERE DatabaseID > 4 -- system databases 
AND DatabaseID <> 32767 -- ResourceDB 
ORDER BY row_num OPTION (RECOMPILE); 

どちらもこれらのクエリの(それらを実行したアプリケーションを識別し、使用のDMVは、その情報を格納しないあなたが行動し、ノートにクエリをキャッチする必要があります:あなたはこのクエリfrom Glenn Allan Berry's DMV queriesでそれを行うことができますsys.dm_exec_sessionsのアプリケーション名、またはトレースを確認してください)。

もちろん、市販のさまざまなサードパーティ製のパフォーマンスツールを使ってこの作業を自動化することができます(免責事項:私はこれらのすべてを実行するPerformance Advisorを生産するSQL Sentryの仕事をしています。高コストのクエリを実行し、実行したデータベースとアプリケーションがどのデータベースを呼び出したかについての情報を保持します)。