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

时间:2011-06-16 11:12:48

标签: sql-server sql-server-2008 perfmon

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

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

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

有什么建议吗?

4 个答案:

答案 0 :(得分:7)

这将有所帮助,Glenn Berry的改编来自Robert Pearl:

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);

答案 1 :(得分:2)

运行探测器跟踪,在峰值期间记录数据库名称和cpu,将数据加载到表中,对db进行计数和分组。

select DatabaseName, sum(CPU) from Trace 
group by DatabaseName

答案 2 :(得分:1)

查看sys.dm_exec_query_stats。 total_worker_time列是CPU的度量。您可以通过一次查看视图来完成您尝试执行的操作。但是,您可能需要提出一个过程来获取视图的“快照”并比较连续的快照。也就是说,查看视图中的数据并将其与五分钟后的数据进行比较并比较差异。差异将是两个快照之间消耗的资源量。祝你好运!

答案 3 :(得分:0)

您是否尝试将SQL Server Profiler与性能监视器相关联? 关联数据时,可以看到与DB活动相关的性能峰值。 http://www.sqlservernation.com/home/relating-sql-server-profiler-with-performance-monitor.html