我们正在运行SQL Server 2008,目前大约有50个不同大小和工作负载的数据库。有时,SQL Server会将CPU完全占用大约一分钟,之后会降至正常的基线负载。
我的问题是我无法确定导致它的数据库或连接(我很确定这是一个缺少索引的特定查询 - 或类似的东西)。 我发现T-SQL查询可以为您提供当前进程的冻结图像。还有“最近昂贵的查询”视图,当然还有分析器,但很难映射到“这是导致它的数据库”答案。 让我更难的是问题在我甚至启动了探查器或活动监视器之前消失了,而且它每天只发生一次或两次。
理想情况下,我想使用性能计数器,这样我可以简单地运行它一两天,然后看一下导致峰值的原因。但是我找不到任何相关的柜台。
有什么建议吗?
答案 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