一年前两次手动使用fn_trace_gettable对跟踪文件进行分析,按TextData排序,通过截取TextData左边N位尝试分组,观察总体相同的过程或语句中的关键字,逐一得出跟踪分析报表,罗列出过程(语句)按CPU、Duration、Reads的执行情况。之后决定找工具,于是正式开启使用RML。最近在博客园看到推荐ClearTrace,尝试使用。
RML下载:https://github.com/Microsoft/SqlNexus/wiki/RML-Utility,ClearTrace下载:http://www.scalesql.com/cleartrace/
首先从服务器收集半小时的跟踪数据,然后分别使用RML和ClearTrace来分析跟踪数据。最看好的都是[按照同一类型的语句,统计最昂贵的语句]
1、将跟踪文件分别导入,具体方法请度娘
RML导入完成后,首先打开的是总体报告

ClearTrace导入完成后,首先打开的是按SQL Text汇总的语句,类似于RML中的"Unique Batches"

2、查看它们的共同点
ClearTrace图中标1的地方,用于选择事件Batches(RPC:Completed、SQL:BatchCompleted)/Statements(SP:StmtCompleted、SQL:StmtCompleted)。大部分跟踪我们选择Batches级别,需要细化问题时才会跟踪Statements级别。因此这里我们只讨论Events为Batches的操作。ClearTrace图中标1与RML图中标1(Unique Batches/Unique Statements)类似。
ClearTrace图中标2的地方,针对跟踪语句按类型分组。等效于RML图中的标2,按程序(Application Name)、数据库(Database Id)、用户名(Login Name)、Unique Batches分组

RML中按程序(Application Name)分组

ClearTrace图中标3的地方,可以查看具体的Login、Host、Application语句消耗情况。类似于点击RML图中的标2的链接后,继续点击下层链接。例如ClearTrace只查看Application为[.Net SqlClient Data Provider]的消耗情况

在RML中对应的Performance Overview->Application Name->.Net SqlClient Data Provider

ClearTrace图中标4的地方,Keyword Filter文本框可以输入关键字进行过滤

结果只返回SQL Text中包含CpuUse的记录,这个功能貌似在RML中没有。
当ClearTrace的Group By置为SQL Text时,双击Item中的条目,会打开对应语句的详细信息,包括以下三个页签:
->SQL:指定语句的规范化语句和样例语句
->History:指定语句按天执行次数,平均消耗情况
->Details:指定语句最后一天,按HostName, LoginName, ApplicationName分组的执行次数

不过ClearTrace返回的都是表格,没有图形也不支持导出;RML有图表,并且支持导出,视觉效果直观(貌似图形显示需要MSChart控件)。
ClearTrace和RML界面上的表格结果差不多,很多时候界面上的东西限制得太死。比如ClearTrace/RML都只是针对一个维度进行Group By,有时我们可能希望在Unique Batches的基础上能显示DatabaseName。这时就需要我们使用脚本去提取,RML的提取脚本参考报表语句。ClearTrace的提取脚本如下

USE ClearTrace
GO
--默认只对TextDataHashCode分组,可根据需求增加Application、Login、Host分组
--关联显示样例语句
;WITH CTE AS (
SELECT TextDataHashCode,
NormalizedTextData AS Item,LoginName,
SUM(ExecutionCount) AS [Executes],
SUM(CPU) AS CPU,
CAST(
CAST(SUM(CPU) AS DECIMAL(22, 2)) / SUM(ExecutionCount)
AS DECIMAL(22, 2)
) AS AvgCPU,
SUM(Reads) AS Reads,
CAST(
CAST(SUM(Reads) AS DECIMAL(22, 2)) / SUM(ExecutionCount)
AS DECIMAL(22, 2)
) AS AvgReads,
SUM(Writes) AS Writes,
CAST(
CAST(SUM(Writes) AS DECIMAL(22, 2)) / SUM(ExecutionCount)
AS DECIMAL(22, 2)
) AS AvgWrites,
SUM(Duration)/1000 AS Duration,
CAST(
CAST(SUM(Duration) AS DECIMAL(22, 2)) / SUM(ExecutionCount)/1000
AS DECIMAL(22, 2)
) AS AvgDuration,
ROW_NUMBER() OVER(ORDER BY SUM(CPU) DESC) AS CpuRank,
ROW_NUMBER() OVER(ORDER BY SUM(Reads) DESC) AS ReadsRank --还可以添加其他项Rank
FROM [dbo].[CTTraceSummaryView] TD
WHERE EventClass IN (10, 12) --Batches:10,12;Statements:41,45
AND NormalizedTextData IS NOT NULL
AND NormalizedTextData <> ''
AND TraceName = '(One Time Trace Analysis)'
--AND ApplicationName = '.Net SqlClient Data Provider'--各种筛选Filter
--AND CalendarDate >= '2016-10-21'
AND LoginName not like '%Administrator%'
GROUP BY
TextDataHashCode,
NormalizedTextData,LoginName
)
SELECT TOP(25) WITH TIES
[Item],
b.SampleTextData,LoginName,
--Add DatabaseName 需要再打开,不然从跟踪文件通过TextData匹配消耗很大
--(select top 1 DatabaseName from fn_trace_gettable(N'F:\TroubleShooting\Trace\FINANCEDB_HighCPU30_20161222.trc', default) where convert(varchar(max),textdata)=convert(varchar(max),b.SampleTextData)) as DatabaseName,
[Executes],
[CPU],
[AvgCPU],
[Reads],
[AvgReads],
[Writes],
[AvgWrites],
[Duration],
[AvgDuration],
[CpuRank],[ReadsRank] --Add
FROM [CTE] a
INNER JOIN [dbo].[CTTextData] b
ON a.[TextDataHashCode]=b.[TextDataHashCode]
ORDER BY
CASE
WHEN [CpuRank] < [ReadsRank] THEN [CpuRank]
ELSE [ReadsRank]
END , [CpuRank], [ReadsRank] --按CPU&Reads排序,类似于RML中的Top/Bottom N
--Executes DESC select top 100 b.Name EventClass,TextData,DatabaseName,DatabaseID,Duration/1000 Duration_ms,CPU CPU_ms,Reads,Writes,StartTime,EndTime,HostName,LoginName,ApplicationName
from fn_trace_gettable(N'F:\TroubleShooting\Trace\FINANCEDB_HighCPU30_20161222.trc', default) a
inner join sys.trace_events b
on a.EventClass=b.trace_event_id
where TextData like '%DBA_Pro_Get_BlockedInfo%'

貌似ClearTrace把Database相关项给舍弃,找到语句不知道是哪个库就有点尴尬了(≧Д≦)。上面脚本尝试使用TextData到跟踪文件中匹配得到DatabaseName,有点鸡胁~

小充电:TOP N WITH TIES..ORDER BY
返回Top N+[ORDER BY字段]与第N条记录的[ORDER BY字段]相同的记录

--看看就懂
select top 3 --with ties
id,remark from (
select 1 id,'1st' remark union all
select 2,'2nd' union all
select 2,'3rd' union all
select 3,'4th' union all
select 4,'5th'
) t
order by id desc --不带with ties
id remark
----------- ------
4 5th
3 4th
2 3rd
(3 行受影响)
--with ties
id remark
----------- ------
4 5th
3 4th
2 3rd
2 2nd
(4 行受影响)

总得来说,如果是要通过分析跟踪文件得到消耗高的语句/存储过程,不需要花哨的图表数据,使用ClearTrace即可。ClearTrace简单的点击导入即可(文件滚动更新得到的.trc可一次性导入),RML需要使用导入命令。有时间再测试下ClearTrace对跟踪文件中的跟踪列是不是有限制,RML必需添加BinaryData列。

ClearTrace的更多相关文章

  1. 一个表缺失索引发的CPU资源瓶颈案例

    背景 近几日,公司的应用团队反应业务系统突然变慢了,之前是一直比较正常.后与业务部门沟通了解详情,得知最近生意比较好,同时也在做大的促销活动,使得业务数据处理的量出现较大的增长,最终系统在处理时出现瓶 ...

  2. .Net 高效开发之不可错过的实用工具

    Visual Studio Visual Studio Productivity Power tool: VS 专业版的效率工具. Web Essentials: 提高开发效率,能够有效的帮助开发人员 ...

  3. .net 高效开发实用工具

    Visual Studio Visual Studio Productivity Power tool: VS 专业版的效率工具. Web Essentials: 提高开发效率,能够有效的帮助开发人员 ...

  4. MVC代码中如何调用api接口

    关于代码解释,为了方便读者浏览时更好理解代码的含义,我把注释都写在代码里面了.因为一开始我只考虑到功能上的实现并没有考虑代码的优化所以代码我就全写在一个页面了.至于那些生成扑克牌类.计算类等代码优化方 ...

  5. .Net程序员飞扬有用的85个工具

    1.Visual Studio Visual Studio Productivity Power tool:Visual Studio专业版(及以上)的扩展,具有丰富的功能,如快速查找,导航解决方案, ...

  6. .Net 高效开发之不可错过的实用工具(转)

    .Net 高效开发之不可错过的实用工具(转) 本文摘自: http://www.cnblogs.com/powertoolsteam/p/5240908.html#3372237 Visual Stu ...

  7. The Accidental DBA

    The Accidental DBA (Day 1 of 30): Hardware Selection: CPU and Memory Considerations 本文大意:      全篇主要讲 ...

  8. RML Utilities for SQL Server

    很早以前有看到过关于使用RML Utilities工具分析SQL Trace(.trc)的文章,但一直没有具体实践.最近接管一台数据库服务器,跟踪出一批高消耗的语句,老大需要跟踪分析报表,罗列出过程( ...

  9. 实用的VS工具

    工具 1.Visual Studio Visual Studio Productivity Power tool:Visual Studio专业版(及以上)的扩展,具有丰富的功能,如快速查找,导航解决 ...

随机推荐

  1. [BI项目记]-DB脚本同步

    BI项目中会有很多不同种类的项目,其中比较比较大的一部分就是对DB脚本的处理.然而DB的脚本毕竟无法在项目中进行维护,所以这里介绍如何对DB的脚本进行版本上的维护. 数据库脚本本身没有项目模板支持,很 ...

  2. 【leetcode】Max Points on a Line

    Max Points on a Line 题目描述: Given n points on a 2D plane, find the maximum number of points that lie ...

  3. DEV express 对Gridview某行的元素赋值

    1:获取选中的行某列的值 string colValue= this.gridView1.GetRowCellValue(this.gridView1.FocusedRowHandle, this.g ...

  4. UWP 设备分辨率

    之前看了下网上,分辨率都是用webview js拿或者全屏拿宽高,很有局限性. 研究一下.找到个完美的方法: public Size GetDeviceResolution() { Size reso ...

  5. git stash和git stash pop

    git stash 可用来暂存当前正在进行的工作, 比如想pull 最新代码, 又不想加新commit, 或者另外一种情况,为了fix 一个紧急的bug,  先stash, 使返回到自己上一个comm ...

  6. LogPolar 对数极坐标

    LogPolar 对数极坐标 cvLogPolar 对数极坐标(logpolar)是仿真生物视网膜中央凹陷的特性,具有数据压缩的能力,可用于目标跟踪中快速尺度和旋转变换不变的模板匹配. 对数极坐标其实 ...

  7. JBD日志的定位、分析和恢复

    在上一篇中,我们介绍了Ext3文件系统的日志可以看做一个文件,由JBD进行管理.自然而然引出如下这些问题: 1)如何定位ext3日志文件和查看日志文件的裸数据? 2)ext3日志文件数据在物理上是如何 ...

  8. Android入门(五):程序架构——MVC设计模式在Android中的应用

    刚刚接触编程的的人,可能会这样认为:只要代码写完了能够跑起来就算完工了.如果只是写一个小程序,“能够跑起来”这样的标准也就可以了,但是如果你是在公司进行程序的开发,那么仅仅让程序成功的跑起来是不行的, ...

  9. *HDU 1385 最短路 路径

    Minimum Transport Cost Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/O ...

  10. Deepin -Android Studio-Genymotion 之旅

    Deepin -Android Studio-Genymotion 之旅 暑假无聊中在deepin系统下配置好了android的开发环境,并使用了比较好的一款模拟器–Genymotion;下面是我配置 ...