使用 100% CPU 的 SQL Server

lee*_*n3o 1 sql sql-server

有没有什么快速的方法可以通过 SQL 查询找出服务器上的哪个站点使用所有 CPU?随机CPU只是坐在100%,我不知道为什么?

Rem*_*anu 6

了解您正在使用的 SQL Server 版本肯定会有所帮助。

我会考虑您使用 SQL Server 2005,因为这是目前最常见的。要确定问题的原因,我建议您下载性能仪表板报告。安装自定义报告并运行部署脚本后,如下载页面的“附加信息”部分所述,您可以performance_dashboard_mail.rdl在 SQL Server Management Studio 中打开自定义报告。从那里您可以链接到 CPU 利用率报告,这些报告将显示系统中每个查询消耗的总时间。这些报告中最顶层的查询是最有可能将系统驱动到 100% CPU 的查询。您必须分析这些查询的执行计划并确定它们为何如此昂贵。SSMS 计划可视化工具在这方面大有帮助,只需遵循计划中的行,因为它们代表大数据流。在这些昂贵的数据流的末尾,您很可能会找到返回表中所有行的聚集索引扫描运算符。您需要了解查询和表结构来决定为什么选择聚集索引扫描,并且您可能必须决定添加一两个索引。性能仪表板可以再次提供帮助,因为它实际上具有利用某种深奥信息sys.dm_db_missing_index_details并以易于阅读的格式呈现的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_seeks, user_scans,user_lookups以了解读取表格的频率和方式。看看user_updates它被写入的频率。
  • sys.dm_db_index_operational_stats收集有关索引访问争用等的信息。查看各个xxx_wait_msxxx_wait_count列以了解发生争用的位置。由于 CPU 处于 100% 的可能性不大,尽管问题是争用,但无论如何我必须向其他读者提供此信息。

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

  • 表扫描。这将在性能仪表板中显示为执行次数相对较少的查询,但每次执行都会持续很长时间。其他症状是高度user_scans依赖于sys.dm_db_index_usage_stats具有许多记录的索引,大量的total_physical_readsin sys.dm_exec_query_stats
  • 在执行中被频繁调用的表值函数。这可以通过execution_count在 stats 视图和 Performance Dashboards中非常大来识别。典型的例子是将逗号分隔的字符串拆分为关系表示的函数(如果我每次都有一角钱......)。
  • 假脱机和排序。不详述,先做功课,调查上面的简单场景。

成功!