讨论了如何使用sys.dm_exec_query_stats动态管理视图(dmv )。本文将以SQL Server 2005为例,讨论如何利用dmv信息来判断tsql的性能优劣。在这篇文章中将继续我有关性能监视问题的讨论,并说明如何使用sys.dm_exec_cached_plans dmv来监视存储过程性能。

  了解dmv统计

  在我开始讨论如何收集存储过程性能的统计数据之前,我们先来回顾一些有关dmv统计的基本知识,如果你已经看过我前面关于dmvs的文章,你应该已经明白SQL Server如何收集和管理dmv信息,你可以跳过该节,从下一节开始看,如果没有,请继续往下读。

  推出SQL Server 2005时,微软介绍了许多被称为dmvs的系统视图,让您可以探测SQL Server 的健康状况,诊断问题,或查看SQL Server实例的运行信息。

  统计数据是在SQL Server运行的时候开始收集的,并且在SQL Server每次启动的时候,统计数据将会被重置。当你删除或者重新创建其组件时,某些dmv的统计数据也可以被重置,例如存储过程和表,而其它的dmv信息在运行dbcc命令时也可以被重置。

  当你使用一个dmv时,你需要紧记SQL Server收集这些信息有多长时间了,以确定这些从dmv返回的数据到底有多少可用性。如果SQL Server只运行了很短的一段时间,你可能不想去使用一些dmv统计数据,因为他们并不是一个能够代表SQL Server实例可能遇到的真实工作负载的样本。另一方面,SQL Server只能维持一定量的信息,有些信息在进行SQL Server性能管理活动的时候可能丢失,所以如果SQL Server已经运行了相当长的一段时间,一些统计数据就有可能已被覆盖。

  因此,任何时候你使用dmv,当你查看从SQL Server 2005的dmvs返回的相关资料时,请务必将以上的观点装在脑海中。只有当你确信从dmvs获得的信息是准确和完整的,你才能变更数据库或者应用程序代码。

  使用次数

  你想知道哪个存储过程执行得最频繁?你可以得到这个结果,但不是如你想像的那样直接去获取它,而只需要把从sys.dm_exec_sql_text表值动态管理函数( DMF )返回的日期加入sys.dm_exec_cached_plans dmv的信息中就可以做到。所以让我通过一些不同的查询来演示一下,以帮助您了解如何使用DMF和DMV获得存储过程的使用次数。

  为了了解sys.dm_exec_cached_plans和sys.dm_exec_sql_text如何工作,请在您的服务器上运行下列代码,并查看输出:

SELECT usecounts, text, dbid, objectid FROM
   sys.dm_exec_cached_plans
cp
   CROSS APPLY
sys.dm_exec_sql_text(cp.plan_handle)
WHERE objtype = 'Proc';

  在这里,我在sys.dm_exec_cached_plans DMV中用CROSS APPLY操作将缓存的计划信息添加到sys.dm_exec_sql_text的输出中。只要DMF从dmv中返回plan_handle值,cross_apply操作将加入这一信息。当在你的机器上运行上述tsql,并查看输出时,你应该会注意到,对于文本列,会有多个行返回同一个值。为什么会发生这种情况?原因是,有时候多个计划存在于同一储存过程的程序缓存中。你可能也察觉到,那个函数看起来就像是扩展存储过程和汇编的CLR存储过程一样。因为某些原因,微软已决定把函数,扩展存储过程,以及CLR存储过程归为一个名为" Proc "的 对象类型 。我认为扩展存储过程和CLR存储过程归类为一个" Proc " 对象类型是有意义的 ,但它将函数也归为"
Proc " 这个对象类型确实是没有意义的,所以,如果只要获得一个用户自定义存储过程的准确使用次数,我把上面的代码做如下修改就可以做到:

SELECT DB_NAME(dbid) AS [DB_NAME], 
       OBJECT_SCHEMA_NAME(objectid,dbid) AS
[SCHEMA_NAME], 
       OBJECT_NAME(objectid,dbid)AS
[OBJECT_NAME], 
       SUM(usecounts) AS [Use_Count], 
       dbid, 
       objectid  
FROM sys.dm_exec_cached_plans cp
   CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)
WHERE objtype = 'Proc'
  AND UPPER(
-- remove white space first
            REPLACE( 
            
REPLACE(
             
REPLACE(
              
REPLACE(
               
REPLACE(
                
REPLACE(
                 
REPLACE(text,'       ',' '),
                
'       ',' '),
               
'      ',' '),
              
'     ', ' '),
             
'    ',' '),
            
'   ',' '),
            ' 
',' ')
           )
       LIKE '%CREATE PROC%'
GROUP BY dbid, objectid;

  为了帮助您更好地理解本代码,让我解释一下我做的事情。为了消除函数,扩展存储过程和CLR存储过程,我在“text”列中搜索词组“CREATE PROC”,因为你可能在编写创建过程语句的时候,在“CREATE” and “PROC”的关键词之间留了多个空格,我用了一系列替换语句,以清除所有的额外空格,也有可能你编写创建过程语句的时候,使用了混合的大小写,所以我使用UPPER函数将文本统一转换成大写。

  当你运行上面代码的时候,你可能会发现一些db_name列是空的。当dbid值是32767时,就会出现这种情况。因为数据库的ID号与系统数据库,即所谓的资源库是有联系的。这个资源库不是众所周知,但它却是存在于系统中的一个实际数据库,他的确存在,但你在SQL Server Management Studio中却看不到它。在你的数据文件目录下,有一个以字符串“mssqlsystemreource”开始命名的MDF和LDF文件,那就是资源数据库了。该资源库包含了所有编译过的系统存储过程和函数,所以为了彻底地找出所有可能的数据库名称,我已经修改了上面的代码,当dbid等于32767时,填写数据库中的名称列,下面是我的代码,由数据库为所有用户自定义的存储过程确定使用次数:

SELECT CASE when dbid = 32767 
            then
'Resource' 
            else
DB_NAME(dbid) end [DB_NAME], 
       OBJECT_SCHEMA_NAME(objectid,dbid) AS
[SCHEMA_NAME], 
       OBJECT_NAME(objectid,dbid)AS
[OBJECT_NAME], 
       SUM(usecounts) AS [Use_Count], 
       dbid, 
       objectid  
FROM sys.dm_exec_cached_plans cp
   CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)
WHERE objtype = 'Proc'
  AND UPPER(
-- remove white space first
            REPLACE( 
            
REPLACE(
             
REPLACE(
              
REPLACE(
               
REPLACE(
                
REPLACE(
                 
REPLACE(text,'       ',' '),
                
'       ',' '),
               
'      ',' '),
              
'     ', ' '),
             
'    ',' '),
            
'   ',' '),
            ' 
',' ')
            ) 
       LIKE '%CREATE PROC%'
GROUP BY dbid, objectid;

存储过程中其它与性能相关的查询

  还有其它一些测量存储过程性能的较好的方法。采用使用次数是有意思的,但它并没有告诉你多少资源被使用或该储存过程运行需要花费多长时间,所以,下面我将介绍一个相应的性能监视的TSQL语句,以全面监控你的存储过程性能。

  我喜欢通过一个存储过程中有多少逻辑I/O操作来衡量它的性能。使用逻辑 I / O是一个衡量存储过程执行效率的很好的方法,因为输入/输出通常是所有操作中费时最长的操作,如果你可以减少一定量的I / O操作,通常来说,你的程序性能将会得到大幅改善。这里是一个脚本,可以显示每一个存储过程执行了多少逻辑 I / O操作:

SELECT CASE when dbid = 32767 
            then
'Resource' 
            else
DB_NAME(dbid) end [DB_NAME], 
       OBJECT_SCHEMA_NAME(objectid,dbid) AS
[SCHEMA_NAME], 
       OBJECT_NAME(objectid,dbid)AS
[OBJECT_NAME], 
       SUM(usecounts) AS [Use_Count], 
       SUM(total_logical_reads) AS
[total_logical_reads],
       SUM(total_logical_reads) / SUM(usecounts)
* 1.0 AS [avg_logical_reads],
       dbid, 
       objectid  
FROM sys.dm_exec_cached_plans cp
   CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)
   JOIN 
   (SELECT SUM(total_logical_reads) AS [total_logical_reads],
          
plan_handle  
      FROM sys.dm_exec_query_stats  
      GROUP BY plan_handle) qs
    ON cp.plan_handle = qs.plan_handle 
WHERE objtype = 'Proc'
  AND UPPER(
-- remove white space first
            REPLACE( 
            
REPLACE(
             
REPLACE(
              
REPLACE(
               
REPLACE(
                
REPLACE(
                 
REPLACE(text,'       ',' '),
                
'       ',' '),
               
'      ',' '),
              
'     ', ' '),
             
'    ',' '),
            
'   ',' '),
            ' 
',' ')
            ) 
       LIKE '%CREATE PROC%'
GROUP BY dbid, objectid
ORDER BY SUM(total_logical_reads) / SUM(usecounts) * 1.0 DESC;

  我使用计算使用次数的查询并把它加入到一个归纳汇总的sys.dm_exec_query_stats dmv中,从而得到每一个存储过程逻辑读的代码。查看avg_logical_reads列,你可以了解到哪些存储过程的效率比较低。

  另一个有意思的事情是衡量一个存储过程执行需要多长时间。所谓执行时间,是指从查询开始到查询结束的时间总量,以秒为单位。有些人也称之为耗费时间,或者说存储过程执行时用户的等待时间。下面是一个查询,用来计算SQL Server 2005中每个存储过程的平均耗费时间:

SELECT CASE when dbid = 32767 
            then
'Resource' 
            else
DB_NAME(dbid) end [DB_NAME], 
       OBJECT_SCHEMA_NAME(objectid,dbid) AS
[SCHEMA_NAME], 
       OBJECT_NAME(objectid,dbid)AS
[OBJECT_NAME], 
       SUM(usecounts) AS
[Use_Count],        
       SUM(total_elapsed_time) AS
[total_elapsed_time],
       SUM(total_elapsed_time) / SUM(usecounts)
* 1.0 AS [avg_elapsed_time],
      
substring(convert(char(23),DATEADD(ms,sum(total_elapsed_time)/1000,0),121),12,23) 
total_elapsed_time_ms,
       dbid, 
       objectid  
FROM sys.dm_exec_cached_plans cp
   CROSS APPLY sys.dm_exec_sql_text(cp.plan_handle)  
   JOIN 
   (SELECT SUM(total_elapsed_time) AS [total_elapsed_time],
          
plan_handle  
      FROM sys.dm_exec_query_stats  
      GROUP BY plan_handle) qs
    ON cp.plan_handle = qs.plan_handle 
WHERE objtype = 'Proc'
  AND UPPER(
-- remove white space first
            REPLACE( 
            
REPLACE(
             
REPLACE(
              
REPLACE(
               
REPLACE(
                
REPLACE(
                 
REPLACE(text,'       ',' '),
                
'       ',' '),
               
'      ',' '),
              
'     ', ' '),
             
'    ',' '),
            
'   ',' '),
            ' 
',' ')
            ) 
       LIKE '%CREATE PROC%'
GROUP BY dbid, objectid
ORDER BY SUM(total_elapsed_time) / SUM(usecounts) * 1.0 DESC;

  结论

  你应该监控你服务器上的所有代码。通过使用这篇文章中代码,你可以找出哪些存储过程使用了大量的资源。在一个开发环境中,当应用正在构建的时候,最适合进行这种监控。你可以使用该技术给你的程序员提供反馈:他们编写的存储过程到底效率如何。给你的程序员一些性能方面的统计数据,可以帮助他们了解怎样才能更好的运行代码,促进高性能设计方式,产生高效率代码。

文章出处:http://database.ctocio.com.cn/tips/161/7810661.shtml

使用sys.dm_exec_cached_plans监控存储过程性能的更多相关文章

  1. [AlwaysOn Availability Groups]监控AG性能

    监控AG性能 AG的性能的性能方面,在关键任务数据库上进行语句级维护性能是很重要的.理解AG如何传输日志到secondary副本对评估RTO和RPO,表明AG是否性能不好. 1. 数据同步步骤 为了评 ...

  2. 【No.2】监控Linux性能25个命令行工具

    接着上一篇博文继续 [No.1]监控Linux性能25个命令行工具 10:mpstat -- 显示每个CPU的占用情况 该命令可以显示每个CPU的占用情况,如果有一个CPU占用率特别高,那么有可能是一 ...

  3. 第七章——DMVs和DMFs(2)——用DMV和DMF监控索引性能

    原文:第七章--DMVs和DMFs(2)--用DMV和DMF监控索引性能 本文继续介绍使用DMO来监控,这次讲述的是监控索引性能.索引是提高查询性能的关键性手段.即使你的表上有合适的索引,你也要时时刻 ...

  4. DBA工具——DMV——通过sys.dm_exec_procedure_stats查看存储过程执行信息

    原文:DBA工具--DMV--通过sys.dm_exec_procedure_stats查看存储过程执行信息 对于DBA来说,经常要手机存储过程的某些信息: 执行了多少次 执行的执行计划如何 执行的平 ...

  5. Dynamic CRM 2013学习笔记(七)追踪、监控及性能优化

    本文将介绍CRM的三个内容追踪.监控及性能优化.追踪是CRM里一个很有用的功能,它能为我们的CRM调试或解决错误.警告提供有价值的信息:我们可以用window的性能监控工具来了解CRM的性能状况:最后 ...

  6. 【No.1】监控Linux性能25个命令行工具

    如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出Linux性能问题所在?通过以下命令或者工具可以快速定位 top vmstat lsof tcpdump netsta ...

  7. 优化系统资源ulimit《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化系统资源ulimit<高性能Linux服务器构建实战:运维监控.性能调优与集群应用> 假设有这样一种情况,一台Linux 主机上同时登录了10个用户,在没有限制系统资源的情况下,这10 ...

  8. 优化Linux内核参数/etc/sysctl.conf sysctl 《高性能Linux服务器构建实战:运维监控、性能调优与集群应用》

    优化Linux内核参数/etc/sysctl.conf  sysctl  <高性能Linux服务器构建实战:运维监控.性能调优与集群应用> http://book.51cto.com/ar ...

  9. 监控Linux性能的18个命令行工具

    监控 Linux 性能的 18 个命令行工具 对于系统和网络管理员来说每天监控和调试Linux系统的性能问题是一项繁重的工作.在IT领域作为一名Linux系统的管理员工作5年后,我逐渐 认识到监控和保 ...

随机推荐

  1. EF2:Entity Mysql Sample

    1)概念 Entity Framework: 全称ADO.NET Entity Framework,是微软开发的基于ADO.NET的ORM(Object/Relational Mapping)框架.百 ...

  2. Java ——对象 类 方法重载 构造方法 封装 内部类

    本节重点思维导图 快捷键 生成代码:alt+shift+s 提取变量:alt+shift+L 快速复制行:alt+ctrl+向上或向下的箭头 删除行:ctrl+d 类:对同一种事物共同属性和行为的抽象 ...

  3. 腾讯视频的手机端的地址和PC端的地址是不一样的

    腾讯视频的手机端的地址和PC端的地址是不一样的,所以使用iframe的时候记得要使用手机端的地址

  4. oracle--角色权限

    将不同权限赋予角色,再将角色赋予用户,起到管理权限的作用 SQL> create role myrole; 角色已创建. SQL> grant create session to myro ...

  5. 两台电脑使用ROS通讯

    一.ROS分布式多机通讯简介 ROS是一种分布式软件框架,节点之间通过松耦合的方式组合,在很多应用场景下,节点可以运行在不同的计算平台上,通过Topic,Service通信. 但是各个节点只能共同拥有 ...

  6. Eureka-server配置servlet.context-path后导致Eureka-client注册到server问题

    在springboot项目里配置了servlet.context-path(应用上下文路径),也称之为项目路径,该配置让项目URL后增加配置的值.如果在Eureka-server中配置该值,当然也会改 ...

  7. Linux中如何将系统调优

    Linux高可用服务器集群解决方案让IT系统管理员可以从容应对许多常见的硬件和软件故障,允许多台计算机一起工作,为关键服务正常运行提供保障,系统管理员可以不中断服务执行维护和升级.Linux服务器有各 ...

  8. GitHub Pages建立第一个静态页面

    1.创建仓库 创建仓库点击右上角的加号,选择newrepository.然后对仓库信息进行设置.注意箭头标识的几个地方.仓库名必须是http://username.github.io的形式.必须勾选p ...

  9. [常用类]排序及Arrays类(简单介绍)

    冒泡排序bubble sort  轻的上浮,重的下沉.两个相邻位置比较,如果前面元素比后面的元素大就换位置 选择排序 select sort 用一个索引上的元素,依次和其他位置上的元素比较,小的放前面 ...

  10. CocosCreator与Laya2.0区别

    1图集: Laya:直接拖拽res里面的图片,当生成图集后,会自动优先使用图集的 Cocos:应该先打图集,且图集里的图就是图集里的图,资源里的图就是资源里的.2者不同 addChild Laya:会 ...