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