草庐IT

五分钟打造自己的sql性能分析工具

草长莺飞飞满天 2023-03-28 原文

五分钟打造自己的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排序,因为步骤毕竟多,而且经常会用到,所以整理成一个存储过程。方便以后分析性能问题。

 找了半天发现不能上传附件。

 

  分类: ​​sqlserver​​​, ​​高性能数据库​

  ​

​鸽子飞扬​​​

       

​« ​​​上一篇: ​​sqlserver常用调优脚本(转)​​ 

​» ​​​下一篇: ​​镜像配置见证机失败解决方案​

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性能分析工具的更多相关文章

  1. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  2. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

  3. postman接口测试工具-基础使用教程 - 2

    1.postman介绍Postman一款非常流行的API调试工具。其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,例如Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。2.下载安装官网地址:https://www.postman.com/下载完成后双击安装吧,安装过程极其简单,无需任何操作3.使用教程这里以百度为例,工具使用简单,填写URL地址即可发送请求,在下方查看响应结果和响应状态码常用方法都有支持请求方法:getpostputdeleteGet、Post、Put与Delete的作用get:请求方法一般是用于数据查询,

  4. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. ruby-on-rails - 有没有一种工具可以在编码时自动保存对文件的增量更改? - 2

    我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功

  7. Ruby 的数字方法性能 - 2

    我正在使用Ruby解决一些ProjectEuler问题,特别是这里我要讨论的问题25(Fibonacci数列中包含1000位数字的第一项的索引是多少?)。起初,我使用的是Ruby2.2.3,我将问题编码为:number=3a=1b=2whileb.to_s.length但后来我发现2.4.2版本有一个名为digits的方法,这正是我需要的。我转换为代码:whileb.digits.length当我比较这两种方法时,digits慢得多。时间./025/problem025.rb0.13s用户0.02s系统80%cpu0.190总计./025/problem025.rb2.19s用户0.0

  8. ruby - Ruby 性能中的计时器 - 2

    我正在寻找一个用ruby​​演示计时器的在线示例,并发现了下面的代码。它按预期工作,但这个简单的程序使用30Mo内存(如Windows任务管理器中所示)和太多CPU有意义吗?非常感谢deftime_blockstart_time=Time.nowThread.new{yield}Time.now-start_timeenddefrepeat_every(seconds)whiletruedotime_spent=time_block{yield}#Tohandle-vesleepinteravalsleep(seconds-time_spent)iftime_spent

  9. ruby-on-rails - 如何测试自己对 Ruby/ROR 的了解? - 2

    是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby​​和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T

  10. ruby-on-rails - 如果条件与 &&,是否有任何性能提升 - 2

    如果用户是所有者,我有一个条件来检查说删除和文章。delete_articleifuser.owner?另一种方式是user.owner?&&delete_article选择它有什么好处还是它只是一种写作风格 最佳答案 性能不太可能成为该声明的问题。第一个要好得多-它更容易阅读。您future的自己和其他将开始编写代码的人会为此感谢您。 关于ruby-on-rails-如果条件与&&,是否有任何性能提升,我们在StackOverflow上找到一个类似的问题:

随机推荐