如何找出什么是锤击我的SQL Server?

我的SQL Server CPU在今天的大部分时间里已经达到了90%左右。

由于它不断被使用,我无法重新启动它。

是否有可能找出SQL内导致这样的CPU过载?

我已经运行了SQL事件探查器,但是如此之多的事情还是很难说,如果有什么特别的东西导致它。

我运行sp_who2,但不知道什么都意味着什么,如果有可能在这里确定可能的问题。

为了抢先任何“这可能只是被用了很多”的反应,这只是今天从完全正常的活动水平踢了今天。

我之后find什么导致SQL中的CPU悲伤的方式。

我在这里承担尽职调查,确认CPU实际上是由SQL进程使用的(perfmon进程类别计数器会证实这一点)。 通常情况下,您会对相关性能计数器进行抽样,并将其与您在正常负载操作条件下build立的基准进行比较。 一旦你解决了这个问题,我build议你build立一个未来比较的基准。

您可以准确findSQL在每个CPU周期中花费的位置。 但知道去哪里看,需要大量的知识和经验。 是SQL 2005/2008还是2000? 幸运的是,在2005年和更新的版本中,有一些现成的解决scheme。 John Samson的回答中已经有了一些很好的指示。 我想添加一个build议来下载和安装SQL Server性能仪表板报告 。 其中一些报告包括按时间或I / O进行的顶级查询,最常用的数据文件等,您可以快速了解问题所在。 输出是数字和graphics,所以对初学者来说更有用。

我也build议使用亚当的谁是主动脚本,虽然这是一个更先进的。

最后但并非最不重要的,我build议你下载并阅读关于性能分析的MS SQL客户顾问团队白皮书: SQL 2005等待和队列 。

我的build议也是看看I / O。 如果你向服务器添加一个负载来缓冲缓冲池(也就是说,它需要太多的数据,它会从内存中逐出caching的数据页面),那么结果将是CPU的显着增加(听起来令人惊讶,但确实如此)。 罪魁祸首通常是一个新的查询,扫描大表端到端。

该查询使用DMV来识别CPU最昂贵的查询

 SELECT TOP 20 qs.sql_handle, qs.execution_count, qs.total_worker_time AS Total_CPU, total_CPU_inSeconds = --Converted from microseconds qs.total_worker_time/1000000, average_CPU_inSeconds = --Converted from microseconds (qs.total_worker_time/1000000) / qs.execution_count, qs.total_elapsed_time, total_elapsed_time_inSeconds = --Converted from microseconds qs.total_elapsed_time/1000000, st.text, qp.query_plan FROM sys.dm_exec_query_stats AS qs CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st CROSS APPLY sys.dm_exec_query_plan (qs.plan_handle) AS qp ORDER BY qs.total_worker_time DESC 

有关完整的说明,请参阅: 如何识别CPU最昂贵的SQL Server查询

运行其中任何一个相隔几秒钟。 你会检测到高CPU连接。 或者:将CPU存储在本地variablesWAITFOR DELAY中,比较存储的和当前的CPU值

 select * from master..sysprocesses where status = 'runnable' --comment this out order by CPU desc select * from master..sysprocesses order by CPU desc 

可能不是最优雅的,但它会有效和快速。

您可以运行SQL事件探查器,并通过CPU或持续时间筛选,以排除所有“小事”。 那么确定是否存在像特定存储过程运行时间比应该更长的问题(可能是缺less索引或某事)应该会容易很多。

两个警告:

  • 如果问题是大量的小事务,那么我上面描述的filter会排除它们,你会错过这个。
  • 另外,如果问题是一个单一的,大量的工作(如8小时分析工作或devise不佳的select必须交叉连接十亿行),那么在完成完成之前,您可能不会在分析器中看到这个问题你正在分析哪些事件(sp:已完成vs sp:statementcompleted)。

但通常我从Activity Monitor或sp_who2开始。

对于GUI方法,我将看看pipe理下的Activity Monitor和CPUsorting。