我会认为您使用 SQL Server 2005,因为这是目前最常见的。要确定问题的原因,我建议您下载性能仪表板报告。安装自定义报告并按照下载页面的其他信息部分中的详细说明运行部署脚本后,您可以performance_dashboard_mail.rdl在 SQL Server Management Studio 中打开自定义报告。从那里您可以获得有关 CPU 利用率报告的链接,这些报告将显示系统中每个查询所消耗的总时间。这些报告中最重要的查询是最有可能将系统驱动到 100% CPU 的查询。您必须分析这些查询的执行计划并确定它们为何如此昂贵。SSMS 计划可视化工具在帮助这一点上有很长的路要走,只要按照厚计划中的行,因为它们代表大量数据流。在这些昂贵的数据流结束时,您很可能会找到返回表中所有行的聚集索引扫描运算符。您需要了解查询和表结构来决定为什么选择聚集索引扫描,并且您可能必须决定添加一个或两个索引。性能仪表板可以再次提供帮助,因为它实际上具有利用来自某种深奥信息sys.dm_db_missing_index_details并以易于阅读的格式呈现的报告,更准确地说,它显示了建议的CREATE INDEX陈述。
了解您正在使用的 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_reads
in来说,数字很大sys.dm_exec_query_stats
。execution_count
在统计视图和性能仪表板中非常大来识别。典型的例子是将逗号分隔的字符串拆分为关系表示的函数(如果我每次都有一角钱......)。成功!
Microsoft SQL Management Studio 中有一个活动监视器,它将显示最昂贵的查询及其 cpu 时间。只需在服务器资源管理器窗口中右键单击服务器,然后单击“活动监视器”
您应该运行SQL Server Profiler来帮助您确定哪些低效查询会导致读取/写入时间过长。
至于快速...好吧,您可以运行一两分钟,这应该可以告诉您是否有一些 SP/查询的运行超出预期。
另请阅读此问题及其接受的答案。
如果 SQL Server Profiler 没有帮助,您可能会开始考虑任何可能的蠕虫攻击。