利用sys.dm_exec_query_stats查找并优化SQL语句

来源:未知 责任编辑:责任编辑 发表时间:2014-02-18 03:26 点击:

今天在看Sql Server 2012 的新特性,当看到某一条时,居然发现了 sys.dm_exec_query_stats 系统视图进行了升级;又由于该试图一直在用,并且相当的有用,可以说是查找并优化Sql 语句的一大利器。所以,今天特做下记录。
 
MSDN 上对  sys.dm_exec_query_stats 视图的定义:返回 SQL Server 2012 中缓存查询计划的聚合性能统计信息。缓存计划中的每个查询语句在该视图中对应一行,并且行的生存期与计划本身相关联。在从缓存删除计划时,也将从该视图中删除对应行。
 
其实说白了,该视图存放的就是当前所有执行计划的详细信息,比如某条执行计划共占CPU多少等等。因为该视图对编译次数、占用CPU资源总量、执行次数等都进行了详细的记录,所以,可以说是优化 DB服务器CPU 的一大利器。
 
由于该试图是动态的,所以并一定总是准确,也可能某条执行计划在查询的时间做了重编译,得到了偏差的信息等;另外,对于 sys.dm_exec_query_stats 中占用资源最多的,并不一定是有性能问题的,要同时观察执行次数 和 IO 读写等,而对于执行过于频繁的,则要考虑在程序中加缓存了;该系统试图不能用作应急优化用,但是日常优化,一定要做一个重要的参考指标。
 
说了这么久,下面放 优化的SQL :
 
SELECT s2.dbid, 
    (SELECT TOP 1 SUBSTRING(s2.text,statement_start_offset / 2+1 , 
      ( (CASE WHEN statement_end_offset = -1 
         THEN (LEN(CONVERT(nvarchar(max),s2.text)) * 2) 
         ELSE statement_end_offset END)  - statement_start_offset) / 2+1))  AS sql_statement,
    execution_count,     plan_generation_num,     last_execution_time,       total_worker_time,     last_worker_time,     min_worker_time, 
    max_worker_time,    total_physical_reads,     last_physical_reads, 
    min_physical_reads,      max_physical_reads,      total_logical_writes,     last_logical_writes,     min_logical_writes,     max_logical_writes
FROM sys.dm_exec_query_stats AS s1 
CROSS APPLY sys.dm_exec_sql_text(sql_handle) AS s2  
WHERE s2.objectid is null
ORDER BY s1.total_worker_time desc
  
具体列的含义,请参考文末。
接下来说下 Sql Server 2012 对  sys.dm_exec_query_stats  试图的增强功能吧:添加了四列,以帮助排除长时间运行的查询所存在的问题。可以使用 total_rows、min_rows、max_rows 和 last_rows 聚合行计数列,分隔那些从出现问题的查询(可能缺少索引或查询计划出错)中返回大量行的查询。
 
具体意思,从名称中就不难看出来;经过本人的试用之后,却发现这个改进对于某些执行计划并不是很实用,为什么呢,因为执行计划是可能接受参数的,所以行数的数量和参数密切相关,所以,对于返回行数和参数密切相关的执行计划,这个改进没有什么用,反之,还是有一定参考作用的。
 
 sys.dm_exec_query_stats 的详细说明:http://msdn.microsoft.com/zh-cn/library/ms189741(v=sql.110).aspx
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • sql常见面试题
  • SQL SERVER 2005性能之跟踪
  • SQL编程(一)
  • LINUX上RMAN自动备份脚本
  • sql server面试题
  • 如何将多个SQL查询统计结果一次显示出来
  • 浅谈SQL Server中的事务日志(三)----在简单恢复模式下日志的角色
  • sql server 列转行
  • SQL小技巧系列 --- 行转列合并
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1