有没有什么快速的方法可以通过 SQL 查询找出服务器上的哪个站点使用所有 CPU?随机CPU只是坐在100%,我不知道为什么?
了解您正在使用的 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_ms和xxx_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中非常大来识别。典型的例子是将逗号分隔的字符串拆分为关系表示的函数(如果我每次都有一角钱......)。成功!