SQL Server使用100%的CPU

有什么快速的方法来找出一个服务器上的网站将使用所有的CPU与SQL查询? 随机CPU只是坐在100%,我不知道为什么?

这肯定会帮助你知道你正在使用的SQL Server的版本。

我会考虑你现在最常用的SQL Server 2005。 要确定问题的原因,我build议您下载性能仪表板报告。 在下载页面的“附加信息”部分中详细介绍的安装自定义报告并运行然后部署脚本之后,可以在SQL Server Management Studio中打开自定义的performance_dashboard_mail.rdl报告。 从那里你可以得到CPU利用率报告的链接,它将显示系统中每个查询所消耗的总时间。 这些报告中最重要的查询是最有可能将系统驱动到100%CPU的查询。 你将不得不分析这些查询的执行计划,并确定它们为什么如此昂贵。 SSMS计划可视化工具可以帮助实现这一目标,只需遵循计划中的粗线条 ,因为它们代表了大量的数据stream。 在这些昂贵的数据stream的最后,您很可能会发现聚集索引扫描操作符返回表中的所有行。 您需要了解查询和表结构,才能决定为什么要select聚簇索引扫描,而且您可能需要决定是否添加一个或两个索引。 性能仪表板可以再次提供帮助,因为它实际上具有利用sys.dm_db_missing_index_details某种深奥的信息并以易读的格式显示的报告,更准确地说,它显示了build议的CREATE INDEX语句。

其他感兴趣的资源是:

  • sys.dm_exec_query_stats收集有关查询执行的信息。 在total_worker_time中具有最高值的查询是消耗大部分CPU的查询。 交叉应用sys.dm_exec_sql_text来检索查询文本。
  • sys.dm_exec_procedure_stats类似于查询统计信息,但是用于过程。 只在SQL Server 2008中。
  • sys.dm_db_index_usage_stats收集关于如何访问表和索引的信息。 查看user_seeksuser_scansuser_lookups来查看表读取的频率和方式。 查看user_updates来查看它被写入的频率。
  • sys.dm_db_index_operational_stats收集索引访问争用等信息。 查看各种xxx_wait_msxxx_wait_count列以了解争用发生的位置。 由于你有100%的CPU是不太可能的,虽然这个问题是争论,但我必须提出这个信息反正其他读者去这个。

调查完成后,您应该能够确定问题:

  • 表扫描。 这会显示在执行相对较less次的性能仪表板中的查询,但是它们持续很长时间每次执行。 其他症状是高user_scans计数sys.dm_db_index_usage_stats索引有很多logging,在sys.dm_exec_query_stats total_physical_reads
  • 表值在执行过程中经常被调用的函数。 这可以通过在stats视图和Performance Dashboards中拥有非常大的execution_count来识别。 典型的例子是将逗号分隔的string拆分为关系表示的function(如果每次都有一angular钱)。
  • 后台打印和sorting。 我不会详述,先做功课,然后调查上面的简单情况。

成功!

Microsoft SQL Management Studio中有一个活动监视器,它将显示最昂贵的查询和它们的CPU时间。 只需右键单击服务器资源pipe理器窗口中的服务器,然后单击“活动监视器”

您应该运行SQL Server Profiler来帮助您确定导致大量读/写时间的低效率查询的位置。

至于快速…那么,你可以运行一两分钟,这应该给你一个是否有一些SP /查询运行超过预期的迹象。

也请阅读这个问题,并接受答案。

如果SQL Server Profiler不起作用,您可能会开始考虑任何可能的蠕虫攻击。