Henry

曾经沧海难为水,除却巫山不是云,取次花丛懒回顾,半缘修道半缘君。

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

通常业务系统遇到性能问题时,需要查找原因,Sqlserver为我们提供了RML工具分析此问题

分析方法如下:

 1. 打开profile跟踪

  选择 Audit Login,Audit Logout,RPC:Completed,RPC:Starting,SQL:BatchCompleted,SQL:BatchStarting事件

     选择DataBaseID 和DataBaseName 列开始跟踪,一般跟踪两个小时作业左右的日志文件,可以图形界面也可以用job定时调用(之前介绍过)

   2.得到.trc文件之后,安装RMLSetup_X86.msi,并在本地安装,本机安装路径如下:C:\Program Files\Microsoft Corporation\RMLUtils

   3.步骤1跟踪的trc文件在本机的C:\1.trc,输入cmd,进入rml安装路径,ReadTrace.exe –I"C:\1.trace.trc" –o"c:\temp\breakout"

   4.分析完成之后可以看到报表界面

  

 

     

 

    

   

  5. 按执行耗费cpu时间排序并可以得到此时间段内的 cpu执行最大时间语句

   

   

 

 

  这样影响性能的语句基本找出来了,接下来的就是优化部分了。

  补充:

   1.trace文件也可以运用于数据库引擎顾问优化

 2.RML分析时是在本地生成了一个数据库,默认是PerfAnalysis,并将trace文件的数据标准化之后导入数据库,为报表展示提供数据

  也可以本机连接至PerfAnalysis库,运用存储过程进行分析:

CREATE PROCEDURE usp_GetAccessPattern
    @duration_filter INT = -1 --传入的参数,可以按照语句执行的时间过滤统计
AS 
    BEGIN
 
 --DECLARE @duration_filter int=1

/*首先得到全部语句的性能数据的总和*/
        DECLARE @sum_total FLOAT,
            @sum_cpu FLOAT,
            @sum_reads FLOAT,
            @sum_duration FLOAT,
            @sum_writes FLOAT
        SELECT  @sum_total = COUNT(*) * 0.01,--这是所有语句的总数。
                @sum_cpu = SUM(cpu) * 0.01, --这是所有语句耗费的CPU时间
                @sum_reads = SUM(reads) * 0.01, --这是所有语句耗费的Reads数目,8K为单位。
                @sum_writes = SUM(writes) * 0.01,--这是所有语句耗费的Writes数目,8K为单位。
                @sum_duration = SUM(duration) * 0.01--这是所有语句的执行时间总和。
        FROM    ReadTrace.tblBatches --这是Read80Trace产生的表,包括了Trace文件中所有的语句。
        WHERE   duration >= @duration_filter --是否按照执行时间过滤

/*然后进行Group by,得到某类语句占用的比例*/
        SELECT  LTRIM(STR(COUNT(*))) exec_stats,
                '' + STR(COUNT(*) / @sum_total, 4, 1) + '%' ExecRatio,
                LTRIM(STR(SUM(cpu))) + ' : ' + +LTRIM(STR(AVG(cpu))) cpu_stats,
                '' + STR(SUM(cpu) / @sum_cpu, 4, 1) + '%' CpuRatio,
                LTRIM(STR(SUM(reads))) + ' : ' + LTRIM(STR(AVG(reads))) reads_stats,
                '' + STR(SUM(reads) / @sum_reads, 4, 1) + '%' ReadsRatio,
--ltrim(str(sum(writes) ))+' : '+ltrim(str(avg(writes) )) --writes_stats,''+str(sum(writes)/@sum_writes,4,1) +'%)',
                LTRIM(STR(SUM(duration))) + ' : ' + LTRIM(STR(AVG(duration))) duration_stats,
                '' + STR(SUM(duration) / @sum_duration, 4, 1) + '%' DurRatio,
                textdata,
                COUNT(*) / @sum_total tp,
                SUM(cpu) / @sum_cpu cp,
                SUM(reads) / @sum_reads rp,
                SUM(duration) / @sum_duration dp
        INTO    #queries_staticstics
        FROM    /* tblUniqueBatches表中存放了所有标准化的语句。*/
                ( SELECT    reads,
                            cpu,
                            duration,
                            writes,
                            CONVERT(VARCHAR(2000), NormText) textdata
                  FROM      ReadTrace.tblBatches
                            INNER JOIN ReadTrace.tblUniqueBatches ON tblBatches.HashId = tblUniqueBatches.hashid
                  WHERE     duration > @duration_filter
                ) B
        GROUP BY textdata --这个group by很重要,它对语句进行归类统计。

--print 'Top 10 order by cpu+reads+duration'
--select top 10 * from #queries_staticstics order by cp+rp+dp desc
        PRINT 'Top 10 order by cpu'
        SELECT TOP 10
                *
        FROM    #queries_staticstics
        ORDER BY cp DESC
--print 'Top 10 order by reads'
--select top 10 * from #queries_staticstics order by rp desc
--print 'Top 10 order by duration'
--select top 10 * from #queries_staticstics order by dp desc
--print 'Top 10 order by batches'
--select top 10 * from #queries_staticstics order by tp desc

        SELECT TOP 10
                *
        FROM    #queries_staticstics
        ORDER BY cp DESC

    END
/*************************************************************/

分析结果同报表展示的一样

 

更多请参考RML Help.pdf

参考资料

http://www.microsoft.com/china/msdn/library/data/sqlserver/Profiler.mspx?mfr=true

  

posted on 2011-05-18 19:32  Henry.Lau  阅读(1739)  评论(0编辑  收藏  举报