确定哪个SQL Server数据库正在加入CPU

Tor*_*hde 4 sql-server perfmon sql-server-2008

我们正在运行SQL Server 2008,目前大约有50个不同大小和工作负载的数据库.有时,SQL Server会将CPU完全占用大约一分钟,之后会降至正常的基线负载.

我的问题是我无法确定哪个数据库或连接导致它(我很确定它是一个缺少索引的特定查询 - 或类似的东西).我发现T-SQL查询可以为您提供当前进程的冻结图像.还有"最近昂贵的查询"视图,当然还有分析器,但很难映射到"这是导致它的数据库"的答案.让我更难的是问题在我甚至启动了探查器或活动监视器之前消失了,而且它每天只发生一次或两次.

理想情况下,我想使用一个性能计数器,所以我可以简单地运行它一两天,然后看一下导致峰值的原因.但是我找不到任何相关的柜台.

有什么建议?

Jim*_*mbo 7

这将有助于格伦贝瑞改编自罗伯特珍珠:

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);
Run Code Online (Sandbox Code Playgroud)