SELECT TOP 50 qs.creation_time
, qs.execution_count
, qs.total_worker_time as cpu
, qs.total_elapsed_time as duration
, qs.total_logical_reads as reads
, t.[text]
FROM sys.dm_exec_query_stats qs CROSS APPLY sys.dm_exec_sql_text(plan_handle) AS t
ORDER BY qs.total_worker_time DESC
CPU应大致等于Duration或C = D
CPU * 100 应该大致等于Reads,或 *C*100 = R*
如果 C < D,那么我们有一个Waiter
如果 C = D,但 C*100 > R,那么我们有计算
如果 C = D 且 C*100 = R,那么我们有一个Runner
Waiter表示我们正在等待某些东西:I/O、阻塞、锁存器、CPU。
计算意味着我们正在做的事情不是读取:CPU 瓶颈、自旋锁、查询编译、UDF/函数 - 计算、计算、SQLCLR/XP、SQL Server 代码
这里有一些很好的文章和一些实际的例子,你可以在这里找到:
如何使用基线检测 SQL Server 性能问题 - 第 1 部分 - 简介
如何使用基线检测 SQL Server 性能问题 - 第 2 部分 - 收集指标和报告
如何使用基线检测 SQL Server 性能问题 - 第 3 部分
虽然第 1 部分将为您提供有关基线是什么的一些基本知识,但在第 2 部分中,您可以找到如何使用“穷人”方法自行完成此操作的信息
第 3 部分提供了一些示例,说明如何建立基线以及如何使用基线通过 ApexSQL Monitor 解决某些问题
我在 SQLServerCentral 上写了一个关于您可能感兴趣的基线的系列:
http://www.sqlservercentral.com/Authors/Articles/Erin_Stellato/351331/
正如肖恩亲切地提到的那样,我还有一门 Pluralsight 课程。如果您有更多问题,请随时与我联系(erin at sqlskills dot com)。
艾琳
性能故障排除
这都是关于查询的。您只需要有关查询的三个信息:CPU、持续时间和读取。
CPU应大致等于Duration或C = D
CPU * 100 应该大致等于Reads,或 *C*100 = R*
如果 C < D,那么我们有一个Waiter
如果 C = D,但 C*100 > R,那么我们有计算
如果 C = D 且 C*100 = R,那么我们有一个Runner
Waiter表示我们正在等待某些东西:I/O、阻塞、锁存器、CPU。
计算意味着我们正在做的事情不是读取:CPU 瓶颈、自旋锁、查询编译、UDF/函数 - 计算、计算、SQLCLR/XP、SQL Server 代码
没有基线,跑步者就没有任何意义。您必须知道查询通常需要更少的时间来运行:过时的统计信息、缺少索引、设计不佳的查询、次优计划、参数嗅探、优化器超时
要收集的数据
服务员:等待统计、query_plan、perfmon、分析器、拦截器脚本/per_stats 脚本、DMV、Xevent
计算:自旋锁统计、查询计划、分析器、设置统计时间、统计 IO、查询计划 XML、跟踪标志、Xperf、Kernrate、F1 Visual Studio、查询文本、perfmon
Runner:查询计划、模式、查询文本、统计信息、缺失索引信息、索引碎片
有许多 DMV、第 3 方软件和脚本可以帮助您收集这些数据。