4

現在、さまざまなサイズとワークロードの約 50 のデータベースで SQL Server 2008 を実行しています。場合によっては、SQL Server が約 1 分間 CPU を完全にスパイクし、その後通常のベースライン負荷に低下することがあります。

私の問題は、どのデータベースまたは接続が原因であるかを特定できないことです(インデックスが欠落している特定のクエリまたはそのようなものであると確信しています)。現在のプロセスの凍結されたイメージを提供する T-SQL クエリを見つけました。「最近の高価なクエリ」ビューともちろんプロファイラーもありますが、 「これはそれを引き起こしているデータベースです」という回答にマップするのは困難です。さらに難しいのは、プロファイラーやアクティビティ モニターを起動する前に問題が解消され、1 日に 1 ~ 2 回しか発生しないことです。

理想的には、パフォーマンス カウンターを使用して、1 日か 2 日実行してからスパイクの原因を調べたいと考えています。ただし、関連するカウンターが見つかりません。

助言がありますか?

4

4 に答える 4

7

これは、Robert Pearl から改作された Glenn Berry の厚意により役立ちます。

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);
于 2011-06-16T12:56:53.863 に答える
2

スパイク中にデータベース名と CPU を記録するプロファイラー トレースを実行し、データをテーブルにロードし、db でカウントおよびグループ化します。

select DatabaseName, sum(CPU) from Trace 
group by DatabaseName
于 2011-06-16T12:38:09.240 に答える
1

sys.dm_exec_query_stats を見てください。total_worker_time 列は、CPU の測定値です。ビューを一目見ただけで、やろうとしていることを達成できるかもしれません。ただし、ビューの「スナップショット」を取得し、連続するスナップショットを比較するプロセスを考え出す必要がある場合があります。つまり、ビュー内のデータを見て、5 分後のデータと比較し、違いを比較します。違いは、2 つのスナップショット間で消費されるリソースの量です。幸運を!

于 2011-06-16T12:10:34.247 に答える
0

SQL Server プロファイラーをパフォーマンス モニターに関連付けてみましたか? データを関連付けると、DB アクティビティに関連するパフォーマンスのスパイクが見られます。 http://www.sqlservernation.com/home/relating-sql-server-profiler-with-performance-monitor.html

于 2011-06-16T17:39:20.630 に答える