五分钟打造自己的sql性能分析工具
1.首先要有一个trace文件

2. 打开trace文件

3. 另存为跟踪表

4.登录你要保存到的目标sqlserver服务器

5. 选择要保存的数据库和表名称

6. 保存完成(左下角出现进度直到显示“已完成”)

7. 在数据库中找到该表(在第5步选择的数据库中找)

8.查看部分结果(TextData就是查询的sql语句,Duration就是查询的时间,这里duration除以1000才是毫秒)

9. 然后我们来分析TextData,如何找到相同的语句,不同的参数。我的分析,TextData主要有3种
1)带参数sql语句(以 exec sp_executesql N' 打头,以 ',N' 结尾可以找出对应的sql语句),如下图

2)存储过程(类似 exec porc_user_insert @username, exec 和 @ 之间为存储过程名),如下图

3)不带参数的sql语句
10. 对trace表的数据进行处理前的一些准备:
1)update trace_20130910 set duration = duration / 1000 where duration is not null -- 时间改为毫秒
2)修改 textdata 为 nvarchar(max)类型,因为textdata默认保存为ntext类型,处理不方便
alter table trace_20130910 alter column textdata nvarchar(max)
3)新增两个字段
alter table [trace_20130910] add proc_sql nvarchar(max) -- 保存该textdata调用的存储过程,原始sql等;
alter table [trace_20130910] add proc_sql_id int -- 为存储过程和原始sql指定一个编号
11. 处理trace数据
1)找出执行的sql脚本(带参数) ,更新到 proc_sql 字段
update [trace_20130910]
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
2)找出执行的存储过程,更新到 proc_sql 字段
update [trace_20130910]
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
3)找出没有参数的sql脚本,更新到 proc_sql 字段
update [trace_20130910] set proc_sql = textdata where proc_sql is null and textdata is not null
12. 统计
1)新建表,用于保存统计数据,trace_20130910每个proc_sql对应一行
create table [trace_20130910_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 -- 所耗时间百分比
)
2)生成统计数据,存入1)步的表中 trace_20130910_stat]
;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 [trace_20130910]
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 [trace_20130910_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
3)更新记录表[trace_20130910]的 proc_sql_id
update [trace_20130910] set proc_sql_id = b.id
from [trace_20130910] a inner join [trace_20130910_stat] b
on a.databaseid = b.databaseid and a.proc_sql = b.proc_sql
13. 查询统计结果
1)查出最耗时的语句或过程
select * from [trace_20130910_stat] order by total_duration desc

2)查询某个过程或者sql语句详情
select * from [trace_20130910] where proc_sql_id = 1

这是根据duration排序,稍微改下就可以按reads排序,因为步骤毕竟多,而且经常会用到,所以整理成一个存储过程。方便以后分析性能问题。
找了半天发现不能上传附件。
五分钟打造自己的sql性能分析工具的更多相关文章
- Hi,腾讯WeTest联合Unity官方打造的性能分析工具UPA,今日全新发布!
早在2016年ChinaJoy开始,WeTest曾受邀出席过Unity中国的线下性能场的活动,介绍我们的自动化框架和王者荣耀的故事.当时的活动很成功,期间我们收到了不少Unity开发者的好评,也为我们 ...
- SQL性能分析之执行计划
一直想找一些关于SQL语句性能调试的权威参考,但是有参考未必就能够做好调试的工作.我深信实践中得到的经验是最珍贵的,书本知识只是一个引导.本篇来源于<Inside Microsoft SQL S ...
- Mysql高级操作学习笔记:索引结构、树的区别、索引优缺点、创建索引原则(我们对哪种数据创建索引)、索引分类、Sql性能分析、索引使用、索引失效、索引设计原则
Mysql高级操作 索引概述: 索引是高效获取数据的数据结构 索引结构: B+Tree() Hash(不支持范围查询,精准匹配效率极高) 树的区别: 二叉树:可能产生不平衡,顺序数据可能会出现链表结构 ...
- Linux 性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- [转]Linux性能分析工具汇总合集
出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章.本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面.如果没有完善的计算机系统知识,网络知识和操作系统知识, ...
- 超全整理!Linux性能分析工具汇总合集
转自:http://rdc.hundsun.com/portal/article/731.html?ref=myread 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章. ...
- (转)超全整理!Linux性能分析工具汇总合集
超全整理!Linux性能分析工具汇总合集 原文:http://rdc.hundsun.com/portal/article/731.html 出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望, ...
- linux下常见的性能分析工具
转载于:http://bian5399.blog.51cto.com/3848702/834715 性能调优的主要目的是使系统能够有效的利用各种资源,最大的发挥应用程序和系统之间的性能融合,使应用高效 ...
- Linux 性能分析 工具命令
背景知识:具备背景知识是分析性能问题时需要了解的.比如硬件 cache:再比如操作系统内核.应用程序的行为细节往往是和这些东西互相牵扯的,这些底层的东西会以意想不到的方式影响应用程序的性能,比如某些程 ...
随机推荐
- iOS:消除项目中警告
引言: 在iOS开发过程中, 我们可能会碰到一些系统方法弃用, weak.循环引用.不能执行之类的警告. 有代码洁癖的孩子们很想消除他们, 今天就让我们来一次Fuck 警告!! 首先学会基本的语句: ...
- vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
vs2010 问题 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏 在安装 VS2010 后,再安装 VS2012 VS2015 等,原来的 .N ...
- Ubuntu中Apache修改DocumentRoot(修改网站根目录)
今天配置好Apache+PHP+MySQL但是apache默认DocumentRoot是/var/www想把它改到我Windows下进行测试的k:/wwwroot把 apache2.conf 翻了好几 ...
- C# GridControl 行背景颜色
使用C# DevExpress_gridControl 行号行样式显示行背景颜色,必须取消自动变换行色属性 取消Focus变色,属性为OptionSelection--EnableAppearance ...
- Java程序员面试失败的5大原因
下面是Java程序员面试失败最有可能的5大原因,当然也许这5点原因适用于所有的程序员,所以,如果你是程序员,请认真阅读以下内容. #1 说得太少 尤其是那些开放式的问题,如“请介绍下你自己”或“请讲一 ...
- 发布自己的nuget包;报错source parameter was not specified
16-10-27 VS下使用 程序包管理器控制台 运行: 1.cd 命令走到 工程文件夹下,使用 ls 命令查看当前目录: 2. 使用 nuget spec 创建: 3. 使用 nuget pack ...
- glusterFS安装维护文档
.规划: .依赖包 yum install libibverbs librdmacm xfsprogs nfs-utils rpcbind libaio liblvm2app lvm2-devel l ...
- new操作符做了什么??
在javascript中,new操作符随处可见,我讲一下我自己对new操作符的理解... 构造函数无返回值 //测试代码 function Foo(name) { var age = 20; this ...
- 在centos安装docker
关闭防火墙 iptables -L systemctl disable firewalld.service systemctl stop firewalld.service 配置代理太麻烦了,建议使用 ...
- linux 硬件信息
1. 查看物理CPU的个数 #cat /proc/cpuinfo |grep "physical id"|sort |uniq|wc -l 2. 查看逻辑CPU的个数 #cat / ...