通常业务系统遇到性能问题时,需要查找原因,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