查找存储过程的执行频率和时间

由于公司最近的数据库服务器CPU非常不稳定。

于是乎下手查找问题的来源。想了下,只能从存储过程的执行状态中下手。

查了下资料,发现MSSQL中的系统表sys.dm_exec_procedure_stats会记录存储过程的执行状态数据。字段含义就不累述了。开始干活:

1、将数据插入一张新表记录

select convert(nvarchar(10),getdate(),121) as countdate,d.* into procedure_stats_daily 
from SYS.procedures S JOIN sys.dm_exec_procedure_stats D  ON S.object_id=D.object_id

2、每天作业执行,将数据插入记录表

insert into procedure_stats_daily
select convert(nvarchar(10),getdate(),121),d.*
from SYS.procedures S JOIN SYS.dm_exec_procedure_stats D  ON S.object_id=D.object_id

3、查看时间@Date的执行情况

DECLARE @Date datetime,@Date1 datetime
SET @Date=‘2016-03-17‘
SET @[email protected]+1
SELECT a.object_id,c.name as ‘存储过程名称‘,
CASE WHEN a.cached_time>[email protected] THEN ISNULL(a.execution_count,0) ELSE ISNULL(a.execution_count-b.execution_count,0)END as ‘执行次数‘,
CASE WHEN a.cached_time>[email protected] THEN ISNULL(a.total_worker_time/1000000,0)ELSE ISNULL((a.total_worker_time-b.total_worker_time)/1000000,0)END as ‘执行时间/秒‘,
case when ISNULL(a.execution_count-b.execution_count,0)=0 then 0.00 
else convert(numeric(18,4),(a.total_worker_time-b.total_worker_time))/(a.execution_count-b.execution_count)/1000000 end as ‘平均执行时间/秒‘ 
FROM
(
select object_id,cached_time,plan_handle,isnull(execution_count,0) as execution_count,isnull(total_worker_time,0)as total_worker_time 
from procedure_stats_daily where [email protected]
)a
FULL JOIN 
(
select object_id,cached_time,plan_handle,isnull(execution_count,0) as execution_count,isnull(total_worker_time,0)as total_worker_time 
from procedure_stats_daily where [email protected]
)b on a.plan_handle=b.plan_handle
left join sys.objects c on a.object_id=c.object_id
order by CASE WHEN a.cached_time>[email protected] THEN ISNULL(a.execution_count,0) ELSE ISNULL(a.execution_count-b.execution_count,0)END desc

根据以上的数据,我们可以查出最频繁的存储过程和效率最低的存储过程,进而给我们的优化工作提供了方向。

时间: 2024-10-11 03:54:26

查找存储过程的执行频率和时间的相关文章

查找存储过程修改时间

SELECT name,modify_date FROM sys.procedures order by modify_date desc 查找存储过程修改时间

LK存储过程的执行信息

近来遇到一个比较困扰的优化问题,存储过程的主体逻辑如下: ALTER PROC [dbo].[DBA_TroubleShooting] AS BEGIN DECLARE @StartTime DATETIME DECLARE @EndTime DATETIME SELECT @StartTime=CONVERT(VARCHAR,GETDATE()-1,112),@EndTime=CONVERT(VARCHAR,GETDATE(),112) DECLARE @Spreader VARCHAR(32

dblink 的源数据表结构修改后在存储过程里执行报错

原情况:A服务器表A服务器B也有一张表A服务器B上有一个存储过程要把本地的head表向A服务器表里插入数据.变更后:在A服务器表里增加了一个字段inserttime,服务器B存储过程本地表向A服务器插入时,记录插入的时间.问题修改语句如下:insert into [email protected]  select t.*,sysdate from A;这个语句单独执行没有问题.但在存储过程里执行一直报错,报值过多. 解决: 猜想可能是dblink的问题,把原来的dblink删除,重新新建一个db

Web 在线文件管理器学习笔记与总结(2)显示文件列表(名称,类型,大小,可读,可写,可执行,创建时间,修改时间,访问时间)

主要函数: filetype() 判断文件类型 filesize() 得到文件大小(字节) is_readable() 判断文件是否可读 is_writeable() 判断文件是否可写 is_executable() 判断文件是否可执行 filectime() 文件创建时间 filemtime() 文件修改时间 fileatime() 文件访问时间 file.func.php 封装文件操作的文件: <?php /* 转换字节大小 */ function transByte($size){ $ar

Sql server中根据存储过程中的部分信息查找存储过程名称的方法【视图和Function】

1.查询的语句: select a.id,b.name,a.*,b.* from syscomments a join sysobjects b on a.id=b.id where b.xtype='P' and a.text like '%usp_cm%' b.xtype='P'指定在什么类型的范围进行搜索 '%usp_cm%'就是你能记得的存储过程中的内容. 2.查找类型: select distinct xtype from sysobjects 找到数据库中所有的对象类型 P是存储过程

使用限制函数执行频率的函数代理

使用代理限制函数的调用频率 假设一个经典的CURD页面上,要做一个Ajax异步查询功能. 放一个查询按钮,点击查询,系统会到远程服务端请求数据,一秒之后返回查询结果. 很快,功能实现了! 但假如用户一秒内点击了三次查询,会发生什么? 为了解决这个问题,我们可能会在用户点击查询之后禁用查询按钮,或者在处理查询时上锁,返回结果后再把锁放开. 很好,做到这里,已足够日常使用. 这里只解决了一个问题:按钮的点击.而输入框的输入.选择框的变化.鼠标的移动.滚轮的滚动,这些事件触发频率高的问题怎么解决? 为

用GetTickCount()计算一段代码执行耗费的时间的小例子

var aNow,aThen,aTime:Longint; begin aThen := GetTickCount(); Sleep(1000);//代码段 aNow := GetTickCount(); aTime := aNow-aThen; ShowMessage(IntToStr(a)); end; 用GetTickCount()计算一段代码执行耗费的时间的小例子,布布扣,bubuko.com

存储过程中执行动态Sql语句

存储过程中执行动态Sql语句 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就是利用sp_executesql,能够重用执行计划,这就大大提供了执行性能,还可以编写更安全的代码.EXEC在某些情况下会更灵活.除非您有令人信服的理由使用EXEC,否侧尽量使用sp_executesql. 1.EXEC的使用 EXEC命令有两种用法,一种是执行一个存储

查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件

查找出/tmp目录下面修改时间是7天以前,大小在50k到2M之间,并以.log结尾的文件. 答:生成环境 [[email protected] tmp]# date -s "20170501" Mon May  1 00:00:00 CST 2017 [[email protected] tmp]# dd if=/dev/zero of=1.log bs=60KB count=1 1+0 records in 1+0 records out 60000 bytes (60 kB) co