SQL Server 使用 100% CPU

SQL Server 使用 100% CPU

有没有快速的方法可以找出服务器上哪个站点的 SQL 查询占用了所有 CPU?CPU 随机处于 100% 状态,我不知道为什么?

答案1

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

我会假设您使用的是 SQL Server 2005,这是目前最常见的版本。为了确定问题的原因,我建议您下载绩效仪表板报告。安装自定义报告并运行部署脚本(详见下载页面的“附加信息”部分)后,performance_dashboard_mail.rdl在 SQL Server Management Studio 中打开自定义报告。从那里,您可以找到有关 CPU 利用率的报告链接,这些报告将显示系统中每个查询所消耗的总时间。这些报告中最热门的查询最有可能使系统达到 100% CPU。您必须分析这些查询的执行计划并确定它们如此昂贵的原因。SSMS 计划可视化工具对此有很大帮助,只需按照厚的计划中的行数越多,它们代表大量数据流。在这些昂贵的数据流的末尾,您很可能会发现返回表中的所有行的 Clustered Index Scan 运算符。您需要了解查询和表结构,才能决定为什么选择 Clustered Index Scan,并且您可能必须决定添加一个或两个索引。Performance Dashboard 可以再次提供帮助,因为它实际上有报告,利用了来自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_seeksuser_scansuser_lookups以了解表的读取频率和读取方式。查看 以user_updates了解表的写入频率。
  • sys.dm_db_index_operational_stats收集有关索引访问争用的信息,以及其他信息。查看各种xxx_wait_msxxx_wait_count列以了解争用发生的位置。由于您的 CPU 使用率为 100%,因此问题不太可能是争用,但无论如何我都必须提供这些信息,以便其他读者了解这一点。

完成调查后,您应该能够识别问题:

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

成功!

答案2

Microsoft SQL Management Studio 中有一个活动监视器,可以显示最昂贵的查询及其 CPU 时间。只需在服务器资源管理器窗口中右键单击服务器,然后单击“活动监视器”即可

答案3

你应该跑SQL Server 事件探查器帮助您确定哪些低效查询导致了大量的读/写时间。

至于快速...好吧,您可以运行一两分钟,这应该会让您知道是否有一些 SP/查询的运行时间超出预期。

另请阅读问题及其可接受的答案。

答案4

如果 SQL Server Profiler 没有帮助,您可能开始考虑任何可能的蠕虫攻击。

相关内容