在上3篇文章里,我们讨论了列出反映服务器当前状态的不同查询。
<a href="http://www.cnblogs.com/woodytu/p/4543346.html">初涉SQL Server性能问题(1/4):服务器概况</a>
<a href="http://www.cnblogs.com/woodytu/p/4543544.html">初涉SQL Server性能问题(2/4):列出等待资源的会话</a>
<a href="http://www.cnblogs.com/woodytu/p/4543817.html">初涉SQL Server性能问题(3/4):列出阻塞的会话</a>
这篇文章我们看下从计划缓存里列出执行状态。
输出结果的每列说明介绍如下:
DatabaseName 执行计划的数据库环境(数据库名)。
Age of the Plan(Minutes) 计划缓存里计划的生存期,单位为分钟。
Last Execution Time 这个计划的上次执行日期和时间。
Total Execution Count 自上次编译后,总执行次数;在执行计划生存期内[Age of the Plan(Minutes)],总执行次数(自上次编译后)。
Total Elapsed Time(s) 执行这个计划总执行次数后[Total Execution Count]的总占用时间,单位为秒。
Average Execution time(s) 这个计划每次执行的平均时间,单位为秒。
Total CPU time (s) 执行这个计划总执行次数后[Total Execution Count]的总CPU时间,单位为秒。
% CPU 与Total Elapsed Time(s)相比,CPU占用时间比。
% Waiting 与Total Elapsed Time(s)相比,等待资源占用时间比。
CPU time average (s) 每次执行的平均CPU时间,单位为秒。
Avg Physical Read 每次执行的平均物理读数。
Avg Logical Reads 每次执行的平均逻辑读数。
Avg Logical Writes 每次执行的平均逻辑写数。
max_physical_reads 每次执行的时候,出新最大物理读数。
max_logical_reads 每次执行的时候,出新最大逻辑读数。
max_logical_writes 每次执行的时候,出新最大逻辑写数。
Individual Query 批处理语句的部分信息。
Batch Statement 批处理查询。
query_plan XML格式的执行计划,点击后我们可以看图示执行计划。
一般我们可以分析前5条记录(通过修改排序规则)的具体语句信息。大多数情况,我们会发现问题出现在临时表的滥用,distinct语句,游标,不合适的表连接条件,不合适的索引等等。其他经常发生的问题是,存储过程对数据库的大量调用(CPU消耗和执行时间都很小)。这个需要和开发人员反馈,修改下具体的实现方式。如果数据经常被调用,可以在程序里使用缓存方法避免与服务器的多次交互。有些对数据库的调用只是检查结果数据是否有改变。有些对数据库的调用是为检查数据库表里是否有新记录,且必须马上处理的。为了完成这些操作,程序会在1秒内多次查询表来找出未处理的记录。这个可以通过程序的异步调用来往表里插入数据来解决,或可以使用.net框架里的sqlDependency来解决。(sqlDependency提供了这样一种能力:当被监测的数据库中的数据发生变化时,SqlDependency会自动触发OnChange事件来通知应用程序,从而达到让系统自动更新数据(或缓存)的目的。)