SQL Server profile使用技巧

介绍

常常会有人问profile工具该怎么使用?有没有方法获取性能差的sql的问题。自从转mysql我本身也差很少2年没有使用profile,突然profile变得有点生疏不得不从新熟悉一下。这篇文章主要对profile工具作一个详细的介绍;包括工具的用途和使用方法等。profile是SQLServer自带的一个性能分析监控工具,它也能够生成数据库引擎优化顾问分析须要的负载数据,好比开发对功能进行调试须要收集执行sql使用profile就是一个很是好的办法,profile主要用于在线实时监控和收集数据用于后期的分析使用,它能够将收集的数据保存成文件和插入到表。mysql

 

 

跟踪属性


1、常规

将跟踪的记录保存到指定的文件。sql

1.最大文件大小数据库

指定最大文件大小的跟踪在达到最大文件大小时,会中止将跟踪信息保存到该文件。使用此选项可将事件分组成更小、更容易管理的文件。此外,限制文件大小使得无人参与的跟踪运行起来更加安全,由于跟踪会在达到最大文件大小后中止。能够为经过 Transact-SQL 存储过程或使用 SQL Server Profiler建立的跟踪设置最大文件大小。windows

最大文件大小选项的上限为 1 GB。默认最大文件大小为 5 MB安全

注意:最大文件的大小建议不要设的太大,特别是须要用于数据库引擎优化顾问使用的文件,太大的跟踪文件须要很长的分析的时间并且因为数据库引擎优化顾问也是把收集的负载文件执行一遍有时候可能会致使负载过大分析失败,同时对服务器的压力持续的时间过长对业务影响也会比较大,默认大小便可,同时启动文件滚动更新,屡次分析。性能优化

2.启用文件滚动更新服务器

若是使用文件滚动更新选项,则在达到最大文件大小时,SQL Server 会关闭当前文件并建立一个新文件。新文件与原文件同名,可是文件名后将追加一个整数以表示其序列。例如,若是原始跟踪文件命名为 filename_1.trc,则下一跟踪文件为 filename_2.trc,依此类推。若是指定给新滚动更新文件的名称已经被现有文件使用,则将覆盖现有文件,除非现有文件为只读文件。默认状况下,将跟踪数据保存到文件时,会启用文件滚动更新选项。session

3.服务器处理跟踪数据数据库设计

确保服务器记录每一个跟踪事件,若是记录事件会显著下降性能,能够清除服务器处理跟踪数据,这样服务器不会再记录事件。

4.最大行数

指定有最大行数的跟踪在达到最大行数时,会中止将跟踪信息保存到表。每一个事件构成一行,所以该参数可设置收集的事件数的范围。设置最大行数使得无人参与的跟踪运行起来更加方便。例如,若是须要启动一个将跟踪数据保存到表的跟踪,同时但愿在该表变得过大时中止跟踪,则可使其自动中止。工具

若是已指定而且达到了最大行数,将在运行 SQL Server Profiler的同时继续运行跟踪,但再也不记录跟踪信息。SQL Server Profiler将继续显示跟踪结果,直到跟踪中止

5.启用跟踪中止时间 

启用跟踪中止时间以后,到了指定的时间跟踪自动中止。每一次跟踪建议都必须得设置一个跟踪中止时间防止忘记关闭跟踪致使服务器空间被占满,默认跟踪1小时。

 

注意:

  • 从 SQL Server 2005 开始,服务器以微秒(百万分之一秒或 10-6 秒)为单位报告事件的持续时间,以毫秒(千分之一秒或 10-3 秒)为单位报告事件使用的 CPU 时间。
  • 在 SQL Server 2000 中,服务器以毫秒为单位报告持续时间和 CPU 时间。
  • 在 SQL Server 2005 及更高版本中,SQL Server Profiler图形用户界面默认以毫秒为单位显示“持续时间”列,可是当跟踪保存到文件或数据库表中以后,将以微秒为单位在“持续时间”列中写入值。

2、事件选择

对于不一样跟踪选择不一样的跟踪事件;经过勾选“显示全部跟踪事件”能够看到全部的跟踪事件,总共有21个事件分类。用得最多的两个分类就是存储过程和TSQL这两个分类主要用来记录执行的存储过程和SQL语句,把鼠标移动到具体的事件上面会显示该事件和事件列的具体说明,接下来就分析几个经常使用的事件和经常使用的事件列。

1.显示全部跟踪事件

勾选以后会将全部的事件都显示出来

2.显示全部列

勾选以后会将全部的列显示出来

3.列筛选

对列增长一些条件,其实能够将它理解在TSQL语句的WHERE后面添加条件,对于整形列直接输入数值便可,对于字符串列就至关于like同样使用不带引号的%%模糊匹配方法。经过勾选“排除不包含值的行”以后跟踪结果就会筛选掉不知足条件的记录。

4.列组织

列组织能够理解成TSQL语句里面作GROUP BY操做,能够将相同的条件放在一块儿去重。

 

事件

1.SQL:Stmt*******

[SQL:StmtStarting]:启动TSQL语句时记录

[SQL:StmtCompleted]:完成TSQL语句时记录

这两事件的区别也同单词的意思同样,StmtStarting是记录事件的开始不关注这个事件在接下来会作什么,StmtCompleted是记录事件结束以后在开始和结束这个过程当中作的一些操做好比一些经常使用的列"Duration","Cpu","Reads","Writes","EndTime"这些列就会出如今StmtCompleted事件中。因此若是你须要收集的记录不关心整个事件过程当中的操做只须要收集数量那么可使用Starting事件好比记录某个语句或者存储过程执行的次数等。

2.SQL:Batch******

[SQL:BatchStarting]:启动TSQL批处理时记录

[SQL:BatchCompleted]:完成TSQL批处理时记录

 

此次我把两个select语句放在一块儿来执行,能够从batch事件中能够看到它记录的整个批处理的SQL同时还包括相关注释,同时整个批处理两个TSQL做为一条事件记录,而stmt事件记录具体的TSQL语句把两个TSQL语句做为两条记录来记录。同时还能够发现两个TSQL的Duration相加是小于整个批处理的duration的,这也是正常的整个批处理在sql编译分析执行这块确定比单个TSQL须要耗费更多的时间,可是相差也是很是的小。

 

batchcompleted事件多用于引擎优化顾问,而stmtcompleted事用于分析单个TSQL语句。一样Stored分类里面的starting事件和completed事件和TSQL里面的是同样的意思。

事件列

列举经常使用的事件列

TextData:文本详细信息,好比详细的执行SQL语句等等。

ApplicationName:链接SQLSever的客户端应用程序名称。

NTUserName:windows用户名

LoginName:SQLServer登入用户名。

CPU:事件占用的CPU时间,在图形化界面可是是毫秒(千分之一秒或 10-3 秒),在文本文件或者数据库表中单位是微妙(百万分之一秒或 10-6 秒)。

Reads:执行逻辑读的次数。

Writes:物理磁盘写入的次数。

Duration:事件的持续时间,也就是统计信息里面显示的占用时间,在图形化界面可是是毫秒(千分之一秒或 10-3 秒),在文本文件或者数据库表中单位是微妙(百万分之一秒或 10-6 秒)

ClientProcessID:调用SQLServer的应用程序进程ID。

SPID:SQLServer为链接分配的数据库进程ID,也就是sys.processes里面记录的进程ID。

StartTime:事件的开始时间。

EndTime:事件的结束时间。

DBUserName:客户端的sqlserver用户名。

DatabaseID:若是指定了USE database就是指定的数据库id,不然就是默认的数据库id(也就是master的数据库id)。因此该列的做用不是很大。

Error:事件的错误号,一般是sysmessage中存储的错误号。

ObjectName:正在引用的对象名称。

3、自带跟踪模板

工具自带了几个比较实用的跟踪模板,通常的跟踪均可以直接使用自带的跟踪模板解决,同时本身也能够建立自定义的跟踪事件和跟踪属性保存成模板供之后使用。

SP_Counts:计算已运行的存储过程数,而且按存储过程的名称进行分组统计,此模板能够分析某时间段存储过程的行为。

Standard:记录全部存储过程和T-SQL语句批处理运行的时间,当你想要监视常规数据库服务器活动时便可使用该模板,通常的跟踪须要使用该模板就能够解决,这也是默认的模板。

TSQL:记录客户端提交给sqlserver的全部T-SQL语句的的内容和开始时间,一般使用该模板用于程序调试。

TSQL_Duration:记录客户端提交给sqlserver的全部T-SQL语句批处理信息以及执行这些语句所需的时间(毫秒),并按时间进行分组,使用该模板能够分析执行慢的查询,此模板的跟踪记录能够用于数据库引擎优化顾问分析使用。

TSQL_Grouped:按提交客户端和登入用户进行分组记录全部提交给SQLServer的T-SQL批处理语句及其开始时间,此模板用于分析某个客户或者用户执行的查询。

TSQL_Locks:记录全部开始和完成的存储过程和T-SQL语句,同时记录死锁信息,此模板用于跟踪死锁。

TSQL_Replay:记录有关已发出的T-SQL语句的详细信息,此模板记录重播跟踪所需的信息,此模板可执行跌到优化,例如基准测试。

TSQL_SPs:记录有关执行的全部存储过程的详细信息,此模板能够分析存储过程的组成步骤。若是你怀疑正在从新编译存储过程,请添加SP:Recomple事件

Tuning:记录有关存储和T-SQL语句批处理的信息以及执行这些语句所需的时间(毫秒),使用此模板生产跟踪输出可用于数据库引擎优化顾问工做负载来优化索引、优化性能。此模板和TSQL_Druation类似后者是作了时间分组。

 

数据库引擎优化顾问


1.若是须要用数据库引擎优化顾问分析跟踪事件记录必须捕获了如下跟踪事件:

  • RPC:Completed

  • SQL:BatchCompleted

  • SP:StmtCompleted

也可使用这些跟踪事件的 Starting 版本。 例如,SQL:BatchStarting。 可是,这些跟踪事件的 Completed 版本包括 Duration 列,它能使数据库引擎优化顾问更有效地优化工做负荷。 数据库引擎优化顾问不优化其余类型的跟踪事件。

数据库引擎优化顾问在优化过程当中提交显示计划请求。 当包含 LoginName 数据列的跟踪表或跟踪文件被用做工做负荷时,数据库引擎优化顾问将模拟 LoginName 中指定的用户。 若是没有为此用户授予 SHOWPLAN 权限(该权限使用户可以为跟踪中包含的语句执行和生成显示计划),数据库引擎优化顾问将不会优化这些语句。 

避免为跟踪的 LoginName 列中指定的每一个用户授予 SHOWPLAN 权限

  1. 经过从未优化的事件中删除 LoginName 列来建立新的工做负荷,而后只将未优化的事件保存到新的跟踪文件或跟踪表中。

  2. 将不带 LoginName 列的新工做负荷从新提交到数据库引擎优化顾问。

数据库引擎优化顾问将优化新的工做负荷,由于跟踪中未指定登陆信息。 若是某个语句没有相应的 LoginName,数据库引擎优化顾问将经过模拟启动优化会话的用户(sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员)来优化该语句。

3.数据库引擎优化顾问不能执行下列操做:

  • 建议对系统表创建索引。

  • 添加或删除惟一索引或强制 PRIMARY KEY 或 UNIQUE 约束的索引。

  • 优化单用户数据库。

4.数据库引擎优化顾问具备下列限制:

  • 数据库引擎优化顾问经过数据采样收集统计信息。所以,在相同的工做负荷上重复运行该工具可能生成不一样的结果。

  • 数据库引擎优化顾问不能用于优化 Microsoft SQL Server 7.0 或更早版本的数据库中的索引。

  • 若是为优化建议指定的最大磁盘空间超过了可用空间,数据库引擎优化顾问将使用指定的值。可是,当您执行建议脚原本实施它时,若是未先添加更多磁盘空间,则脚本会失败。可使用 dta实用工具的 -B 选项指定最大磁盘空间,也能够经过在“高级优化选项”对话框中输入值来指定最大磁盘空间。

  • 为了安全起见,数据库引擎优化顾问不能优化驻留在远程服务器上的跟踪表中的工做负荷。若要解除此限制,能够选择如下选项之一:

    • 使用跟踪文件而不使用跟踪表。

    • 将跟踪表复制到远程服务器。

  • 当强制实施约束时,例如为优化建议指定最大磁盘空间时强制的约束(经过使用 -B 选项或“高级优化选项”对话框),数据库引擎优化顾问可能会被迫删除某些现有的索引。在此状况下,生成的数据库引擎优化顾问建议可能生成负的预期提升值。

  • 指定限制优化时间的约束时(经过使用 dta 实用工具的 -A 选项或经过选择“优化选项”选项卡上的“限制优化时间”),数据库引擎优化顾问可能超过该时间限制,以便针对到当时为止已处理的工做负荷,生成精确预期的提升值和分析报告。

5.数据库引擎优化顾问可能在下列状况下不提供建议:

  • 正在优化的表所包含的数据页数少于 10。

  • 建议的索引对当前物理数据库设计的查询性能预计带来的提升值不够。

  • 运行数据库引擎优化顾问的用户不是 db_owner 数据库角色或 sysadmin 固定服务器角色的成员。工做负荷中的查询在运行数据库引擎优化顾问的用户的安全上下文中进行分析。该用户必须是db_owner 数据库角色的成员。

6.数据库引擎优化顾问可能在下列状况下不提供分区建议:

  • 未启用 xp_msver 扩展存储过程。此扩展存储过程用于提取要优化的数据库所在服务器上的处理器数目以及可用内存。请注意,安装 SQL Server 后,默认状况下,此扩展存储过程处于打开状态。有关详细信息,请参阅了解外围应用配置器和 xp_msver (Transact-SQL)。

7.性能注意事项

在分析过程当中,数据库引擎优化顾问可能占用至关多的处理器及内存资源。若要避免下降生产服务器速度,请采用下列策略之一:

  • 在服务器空闲时优化数据库。数据库引擎优化顾问可能影响维护任务性能。

  • 使用测试服务器/生产服务器功能。有关详细信息,请参阅减轻生产服务器优化负荷。

  • 指定数据库引擎优化顾问仅分析物理数据库设计结构。数据库引擎优化顾问提供许多选项,可是请仅指定所需选项。

注意:因为数据库引擎优化顾问进行性能优化时也是将负载记录中的语句执行一篇查询分析执行计划的操做,因此对服务器一样存在压力。特别是对于大的负载分析可能须要分析一个小时甚至更长,这样可能会持续对服务器形成压力,因此避免在业务高峰期进行使用引擎优化顾问进行负载分析。

实例 


接下来就列举三个案例,使用数据库引擎优化顾问来分析跟踪记录优化索引的案例、监控死锁的案例、建立自定义跟踪模板案例。

案例1:优化索引

1.建立测试数据

复制代码
--建立测试表
CREATE TABLE [dbo].[book](
    [id] [int] NOT NULL PRIMARY KEY,
    [name] [varchar](50) NULL);


--插入10W条测试数据
DECLARE @id int
SET @id=1
WHILE @id<100000
BEGIN
INSERT INTO book values(@id,CONVERT(varchar(20),@id))

SET @id=@id+1
END;
复制代码

2.建立跟踪

这里使用默认的跟踪模板“tuning”

1.建立好跟踪后点击运行便可,事件选择这里保持默认

2.执行SQL

SELECT * FROM book WHERE name='10001';

因为name字段没有建索引因此该查询执行计划分析事后会返回建立name字段的索引,经过引擎优化顾问分析一样如此

3.中止跟踪

在使用数据库引擎优化顾问分析负载跟踪以前必须先中止跟踪。

4.打开数据库引擎优化顾问

能够直接在profile的工具栏选择打开,“文件”选择刚才的跟踪文件,“负载数据库”选择须要进行优化的数据库,“选择要优化的数据库和表”也就须要优化的数据库的相关表。优化选项没有特别的需求选择默认便可,而后点击“开始分析”。

引擎优化顾问会自动生成建立索引的脚步,同时还给出了建立该索引以后预计性能能够提供的百分比,若是同时存在不少表的索引建议能够勾选须要保存的建议保存成sql文件在“开始分析”栏旁边有一个保存建议的按钮能够将建议保存成sql文件。

建议:

1.数据库引擎优化顾问给出的建议不是每个都是对的,本身对比该SQL的执行频率来判断是否须要建立该索引,好比我当前这个SQL若是我这个SQL只执行了一次后面就不会再执行了那么这个索引就不必建立了。

2.修改引擎优化顾问给出的索引名,数据库引擎优化顾问给出的建立索引的索引名不够直观,建议本身手动更改,好比改为“ix_book_name”,“索引标示_表名_字段描述”的规则。

3.用来分析的文件不要太大不然可能会分析不完成,不要在业务高峰期进行分析。

案例2:监控死锁

1.建立跟踪

 

模板选择自带的“TSQL_Locks”模板,运行跟踪。

2.执行SQL

打开两个会话窗口分表执行以下SQL,先在会话1执行而后在10S内在会话2中执行,两个会话拥有各自的排他锁同时又去申请对方拥有的排他锁形成死锁。

会话1执行:当前会话1是62

复制代码
BEGIN TRANSACTION
UPDATE book 
SET name='a'
WHERE ID=10

--延时10s执行
waitfor delay '0:0:10'

UPDATE book 
SET name='a'
WHERE ID=100
复制代码

会话2执行:当前会话2是

复制代码
BEGIN TRANSACTION
UPDATE book 
SET name='b'
WHERE ID=100

--延时20执行
waitfor delay '0:0:20'

UPDATE book 
SET name='b'
WHERE ID=10
复制代码

msms客户端返回的错误消息显示当前62会话做为死锁的牺牲品。

3.跟踪分析死锁

 死锁跟踪事件使用图形和直观的返回了两个会话的死锁,其中62会话用了一个×表示当前的会话是死锁的牺牲品。

案例三:建立自定义跟踪模板

 标准模板就是一个比较好的参考模板,好比咱们对执行语句进行监控就能够参考标准模板在其基础上修改保存成本身的模板。

1.建立TSQL语句跟踪

2.建立跟踪模板

中止当前的TSQL跟踪,选择“文件”-“另存为跟踪模板”就能够保存成本身的跟踪模板。

3.列筛选

 

当前是筛选跟踪的TSQL语句中包含book,这里的列筛选这执行 where like 的语法相似。

整形列的话就不须要带模糊条件:

注意:若是要取消列筛选记得把刚才的筛选条件删除同时把“排除不包含值的行” 的勾选也去除,记得二者都要去掉不然跟踪仍是包含筛选的跟踪。

4.列组织

列组织其实就是按某列进行分组显示跟踪,相似select查询里面的group by操做。好比我当前按持续时间进行分组跟踪。

经过对持续时间进行分组,相同的持续时间会放在一个分组里。

总结

 因为篇幅有限列举了一些简单经常使用的操做,其它的分类监控的方法相似有兴趣能够多去研究,profile是很是实用且界面化很好的监控工具这也是SQLServer独特的条件,应该熟练运用。

相关文章
相关标签/搜索