4

我们正在运行 SQL Server 2008,目前大约有 50 个不同大小和工作负载的数据库。有时,SQL Server 会在大约一分钟内完全使 CPU 达到峰值,然后下降到正常的基线负载。

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

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

有什么建议么?

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

Run a profiler trace logging the database name and cpu during a spike, load the data up into a table, count and group on 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 的度量。您可以通过查看视图来完成您想要做的事情。但是,您可能需要想出一个过程来拍摄视图的“快照”并比较连续的快照。即查看视图中的数据,与五分钟后的数据进行比较,比较差异。差异将取决于两个快照之间消耗的资源量。祝你好运!

于 2011-06-16T12:10:34.247 回答
0

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

于 2011-06-16T17:39:20.630 回答