zoukankan      html  css  js  c++  java
  • profiler跟踪事件存为表之后性能分析工具

    使用profiler建立跟踪,将跟踪结果存到表中,使用下面存储过程执行 exec temp_profiler 'tra_tablename'对表数据进行处理归类,然后进行性能分析

    1.先建存储过程

    2.再执行下面的查询

    --处理trace数据 
    --exec temp_profiler 'temp_profiler201509061618'
    select top 10000 * from temp_profiler201509061618 order by reads desc
    --1)查出最耗时的语句或过程  
    select * from temp_profiler201509061618_stat order by total_duration desc
    --3) 统计某个过程或者sql语句的个数 
    select  proc_sql_id ,count(1) counts from  temp_profiler201509061618  group by  proc_sql_id  order by counts desc 
    --2)查询某个过程或者sql语句详情 
    select  *  from  temp_profiler201509061618  where proc_sql_id = 3--1047
    select  *  from  temp_profiler201509061618  where proc_sql_id = 22--672
    select  *  from  temp_profiler201509061618  where proc_sql_id = 18--33

    exec temp_profiler 'temp_profiler201508210920'
    select top 10000 * from temp_profiler201508210920 order by reads desc
    select * from temp_profiler201508210920_stat order by total_duration desc
    select  proc_sql_id ,count(1) counts from  temp_profiler201508210920  group by  proc_sql_id  order by counts desc
    select  *  from  temp_profiler201508210920  where proc_sql_id = 2--5761
    select * from temp_profiler_2015060816 where textdata like 'exec PageList%'

    USE [temp_profiler]
    GO
    
    /****** Object:  StoredProcedure [dbo].[temp_profiler]    Script Date: 08/26/2015 10:16:31 ******/
    SET ANSI_NULLS ON
    GO
    
    SET QUOTED_IDENTIFIER ON
    GO
    
    -- =============================================
    --http://www.cnblogs.com/davidhou
    -- Author:        <houpeidong>
    -- Create date: <20150611>
    -- Description:    <profiler抓取到的数据存入表中,此存储过程功能为性能分析工具,表名不能加中括号>
    -- =============================================
    CREATE PROCEDURE [dbo].[temp_profiler]
    @tblName NVARCHAR(500)
    as
    begin
    
    SET NOCOUNT ON
    
    --DECLARE @tblName NVARCHAR(500) ;  
    --set @tblName = 'temp_profiler_20151' ;
    
    DECLARE @sqlStr NVARCHAR(2000);
    
    --10. 对trace表的数据进行处理前的一些准备:
     -- 时间改为毫秒
    SET @sqlStr = N'update ' + @tblName +' set duration = duration / 1000 where duration is not null ';
    EXECUTE sp_executesql @sqlStr ;
    
    --update temp_profiler_2015060917 set duration = duration / 1000 where duration is not null  -- 时间改为毫秒
    
        --修改 textdata 为 nvarchar(max)类型,因为textdata默认保存为ntext类型,处理不方便
    SET @sqlStr = N'alter table '+@tblName+' alter column textdata nvarchar(max)';
    EXECUTE sp_executesql @sqlStr ;
    --alter table temp_profiler_2015060917 alter column textdata nvarchar(max)
    
        --新增两个字段
    SET @sqlStr = N'alter table '+@tblName+' add proc_sql nvarchar(max)';
    EXECUTE sp_executesql @sqlStr ;
    --alter table temp_profiler_2015060917 add proc_sql nvarchar(max) -- 保存该textdata调用的存储过程,原始sql等;
    
    SET @sqlStr = N'alter table '+@tblName+' add proc_sql_id int';
    EXECUTE sp_executesql @sqlStr ;
    --alter table temp_profiler_2015060917 add proc_sql_id int -- 为存储过程和原始sql指定一个编号
    
    --11. 处理trace数据 
    -- 1)找出执行的sql脚本(带参数) ,更新到 proc_sql 字段
    SET @sqlStr = N'
    update '+@tblName+'
             set proc_sql = replace(left(textdata,charindex('''''',N'''''',textdata) - 1),''exec sp_executesql N'''''','''')
             where (proc_sql is null or proc_sql = '''' )
             and charindex(''exec sp_executesql N'', textdata ) = 1
             ';
    EXECUTE sp_executesql @sqlStr ;
    
    --2)找出执行的存储过程,更新到 proc_sql 字段
    SET @sqlStr = N'
    update '+@tblName+'
             set proc_sql =
             replace(
             replace(
             left(
             right(textdata,len(textdata) - charindex(''exec '',textdata) + 3),
             charindex(''@'',
             right(textdata,len(textdata) - charindex(''exec '',textdata) + 3)
             )
             ),''exec '','''')
             ,''@'','''')
             where (proc_sql is null or proc_sql = '''' )
             and charindex(''exec '',textdata) > 0
             ';
    EXECUTE sp_executesql @sqlStr ;
             
    
    --3)找出没有参数的sql脚本,更新到 proc_sql 字段         
    --update temp_profiler_2015060917 set proc_sql = textdata where proc_sql is null and textdata is not null
    SET @sqlStr = N'update '+@tblName+' set proc_sql = textdata where proc_sql is null and textdata is not null'
    EXECUTE sp_executesql @sqlStr ;
    
    
    --12. 统计
        --1)新建表,用于保存统计数据,trace_20130910每个proc_sql对应一行
    SET @sqlStr = N'    
    create table ['+@tblName+'_stat]
    (
    id int identity(1,1) primary key,
    databaseid int,
    proc_sql nvarchar(max), -- 对应trace_20130910的proc_sql
    total_duration bigint, -- 总耗时
    max_duration int, -- 该语句最大耗时
    min_duration int, -- 该语句最小耗时
    rate_duration int -- 所耗时间百分比
    )
    ';
    EXECUTE sp_executesql @sqlStr ;
    
    
    
    --2)生成统计数据,存入1)步的表中 trace_20130910_stat]
    SET @sqlStr = N'
    ;with cte
    (
    databaseid,
    proc_sql,
    total_duration,
    max_duration ,
    min_duration
    ) as
    (select databaseid,
    proc_sql,
    sum(duration) as total_duration,
    max(duration) as max_duration,
    min(duration) as min_duration
    from '+@tblName+'
    where proc_sql is not null and proc_sql <> ''''
    group by databaseid,proc_sql
    )
    , cte2 as
    (-- 总耗时,用来计算百分比
    select sum(total_duration) as total_duration from cte
    )
    insert into ['+@tblName+'_stat]
    (
    databaseid,
    proc_sql,
    total_duration,
    max_duration ,
    min_duration ,
    rate_duration
    )
    select
    databaseid,
    proc_sql,
    total_duration,
    max_duration ,
    min_duration ,
    100 * total_duration / ( select total_duration from cte2 ) as rate_duration
    from cte
    order by rate_duration desc
    ';
    EXECUTE sp_executesql @sqlStr ;
    
    -- 3)更新记录表[trace_20130910]的 proc_sql_id
    SET @sqlStr = N'
    update ['+@tblName+'] set proc_sql_id = b.id
             from ['+@tblName+'] a inner join ['+@tblName+'_stat] b
             on a.databaseid = b.databaseid and a.proc_sql = b.proc_sql
    ';
    EXECUTE sp_executesql @sqlStr ;
    end ;
    GO
  • 相关阅读:
    11111 Generalized Matrioshkas
    Uva 442 Matrix Chain Multiplication
    Uva 10815 Andy's First Dictionary
    Uva 537 Artificial Intelligence?
    Uva 340 MasterMind Hints
    SCAU 9508 诸葛给我牌(水泥题)
    Uva 10420 List of Conquests(排序水题)
    Uva 409 Excuses, Excuses!
    10/26
    11/2
  • 原文地址:https://www.cnblogs.com/davidhou/p/4759577.html
Copyright © 2011-2022 走看看