记得某次给一家公司调优的时候,负责人发给我一堆业务的T-SQL脚本,我面对海量脚本还是从容,虽然不了解内部复杂的业务,但是我们得专注问题的关键 “慢”,我们根据查询的“慢”把他们筛选出来,一一调式优化,不就迅速解决问题吗?三天后,负责人含泪握着我的手,哥们辛苦了,查询响应得到了质的改善。

  跟踪提供者

  SQL Server 为我们两者提供跟踪的方式:一种是一个物理文件(可保存在本机或者UNC网络路径),一种是行集。对于后者大家应该比较熟悉

  

  这个工具在 SSMS 的 工具 –> SQL Profile

  

  详细的我暂时不介绍,先说说两者的区别和类同点 DIFFAndSame(行集,文件提供者)。

  两者都是用类似Buffer来保存当前的事件数据,很明显是为了减少IO的压力,这样可以不阻塞和尽量不遗漏 事件数据,当Buffer 到达一定量时候可能才会Flush到磁盘或者发送到网络的终端(客户端)显示监控行集。

  物理文件保存监控结果的方式的重要保证是不能遗漏任何事件,一旦IO降速的时候,可能会影响到整个T-SQL的执行情况。

  SELECT * FROM sys.dm_os_wait_stats WHERE wait_type IN ('SQLTRACE_LOCK','IO_COMPLETION');

  我使用这个语句来监控TRACE 和IO 完成对我当前机器的影响,我的某个客户的IO情况:

  wait_type waiting_tasks_count wait_time_msmax_wait_time_ms signal_wait_time_ms

  IO_COMPLETION66030898243774993634 418960

  SQLTRACE_LOCK12007 1759431001 1281

  因为我进行了大量的过滤,因此这个值还是能够接受的,影响不是特别大。

  行结果集的方式,其实也是我们最熟悉的,就是使用SQL Server Profile监控GUI 直接展现给我们看到的。但是,我是非常不建议使用的,首先如果Buffer满了,它有一定的延迟,可能会抛弃事件已清空缓存区继续接受事件,而事件没有发送到Client,也没有写到物理文件,自然就丢失了。比如,SQL Server Profile 在DB服务器进行监控,因为高负载的机器再用来展示,很有可能就会丢失事件,另外物理文件方式,其实是接受一个足够大的Buffer,进行的大块写操作,性能是优于行集的。

  

  保密性原则

  SQL Server的安全特性会自动过滤 包含隐私的数据,比如密码。我在我的SSMS中执行了如下的语句:

  EXEC sp_password 'pp','pp1','sa';

  这是修改sa帐号密码的系统sp,我打开了SQL Server Profile –> 选择了T-SQL 监控模版

   

  然后执行上面的存储过程,监控结果:

  

  监控结果:--*sp_password----------------------------

  SQL Server Profile

  使用SQL Server Profile GUI工具还是很多优势,首先是减少了我们监控的复杂性,可以快速的建立监控,在跟踪属性中,可以可以选择MSSQL为我们提供的模版,包括常用的T-SQL、T-SQL Duration、T-SQL Locks模版分别监控当前DB运行的所有查询,所有查询的耗时、所有的锁定状态。

  在跟踪属性 –> 选择事件选择 我们可以选择自己需要的事件,所有的事件在MSDN 都有定义->单击列筛选器 可以自定义过滤,排序噪点干扰因素

  

  其他的模版大家可以自己看看MSDN 手册,自己尝试一下:SQL Server 2008 R2 本机 MSDN

  服务器端跟踪和物理方式收集

  SQL Server Profile 只是对一些存储过程的封装,我更倾向于,自己定义常用的脚本,将监控结果保存在本机,用来大量的分析和存档。

  当然涉及4个存储过程,虽然设置过滤的脚本非常麻烦,但是SQL Server Profile 可以利用 文件->导出 可以导出监控脚本意味着,我们不需要编写复杂的T-SQL 脚本,不过还是建议大家熟悉这几个存储过程:

  sp_trace_create 定义跟踪 ,创建的跟踪会在sys.traces查询的到。

  s_trace_setevent 设置监控事件

  sp_trace_setfilter 设置过滤

  sp_trace_setstatus 设置跟踪的状态 常用的是 sp_trace_setstatus @traceid,0 停止功能 、sp_trace_setstatus @traceid,2 移除跟踪,这将导致sys.traces最终查询不到该跟踪

  其实整个跟踪还是比较简单的。我这里有一个常用的脚本:

  用来 监控超过指定秒数 和 数据库 的 批处理和存储过程 语句(超过5MB的文件,会执行ROLLOVER,根据文件名在后面添加类似_1,_2.trc的跟踪结果):

  CREATE PROC [dbo].[sp_trace_sql_durtion]

  @DatabaseName nvarchar(128),

  @Seconds bigint,

  @FilePath nvarchar(260)

  AS

  BEGIN

  DECLARE @rc int,@TraceID int,@MaxFileSize bigint;

  SET @MaxFileSize = 5;

  EXEC sp_trace_create @TraceID OUTPUT,2,@FilePath,@MaxFileSize,NULL;

  IF @rc != 0

  RETURN;

  DECLARE @On bit;

  SET @On = 1;

  EXEC sp_trace_setevent @TraceID,10,35,@On;

  EXEC sp_trace_setevent @TraceID,10,1,@On;

  EXEC sp_trace_setevent @TraceID,10,13,@On;

  EXEC sp_trace_setevent @TraceID,41,35,@On;

  EXEC sp_trace_setevent @TraceID,41,1,@On;

  EXEC sp_trace_setevent @TraceID,41,13,@On;

  SET @Seconds = @Seconds * 1000000;

  EXEC sp_trace_setfilter @TraceID,13,0,4,@Seconds;

  IF @DatabaseName IS NOT NULL

  EXEC sp_trace_setfilter @TraceID,35,0,0,@DatabaseName

  EXEC sp_trace_setstatus @TraceID,1

  SELECT TraceID = @TraceID;

  END

  参数非常的明了,数据库名称、执行事件超过多少秒、保存的路径。

  当我们运行这个脚本一段事件以后,可以快速的发现大量耗时的T-SQL,我们可以通过

  SELECT * FROM fn_trace_gettable(N'监控文件路径',1);

  来查看行方式的结果。

  同样的富有创造力的读者可以自己创建监控锁定,监控死锁等方式保存文件,但是我的建议是尽可能的减少噪音,也就是说我们要达到什么目地就

  建立什么功能,这样才能将大问题细化解决。

  在《Microsfot SQL Server 2005 技术内幕: T-SQL 程序设计》 中有一个正则,用来将类似的语句全部组合成,只有参数形式替换具体值

  的SQL CLR,但是我认为那个正则还有bug,等我空了给大家写一个,自己也能使用的更完善。

  监控异常

  在上个系列中,讲述了具体的SQL Event抓去的异常,可以及时通知,但是具体的异常信息,并不是特别详细。因此我们可以选择事件中的

  Error来添加有关T-SQL批处理和SP的所有异常,用于分析,这个跟踪非常有利于我们监控一些异常情况!!!

  我创建了一个跟踪的脚本,和上面的跟踪事件的脚本一样,超过5MB RollOver。

  我们要定期的执行这个跟踪,虽然不建议长期开启,但是定期监控处理异常是有利我们系统更加长时间运作的。

  CREATE PROC [dbo].[sp_trace_sql_exception]

  @FilePath nvarchar(260)

  AS

  DECLARE @rc int,@TraceID int,@Maxfilesize bigint

  SET @maxfilesize = 5

  EXEC @rc = sp_trace_create @TraceID output, 2, @FilePath, @Maxfilesize, NULL

  IF (@rc != 0)

  RETURN;

  DECLARE @on bit

  SET @on = 1

  EXEC sp_trace_setevent @TraceID, 33, 1, @on

  EXEC sp_trace_setevent @TraceID, 33, 14, @on

  EXEC sp_trace_setevent @TraceID, 33, 51, @on

  EXEC sp_trace_setevent @TraceID, 33, 12, @on

  EXEC sp_trace_setevent @TraceID, 11, 2, @on

  EXEC sp_trace_setevent @TraceID, 11, 14, @on

  EXEC sp_trace_setevent @TraceID, 11, 51, @on

  EXEC sp_trace_setevent @TraceID, 11, 12, @on

  EXEC sp_trace_setevent @TraceID, 13, 1, @on

  EXEC sp_trace_setevent @TraceID, 13, 14, @on

  EXEC sp_trace_setevent @TraceID, 13, 51, @on

  EXEC sp_trace_setevent @TraceID, 13, 12, @on

  DECLARE @intfilter int,@bigintfilter bigint;

  EXEC sp_trace_setstatus @TraceID, 1

  SELECT TraceID=@TraceID

  GOTO finish

  ERROR:

  SELECT ErrorCode=@rc

  FINISH:

  定期执行吧,同志们,找异常。。。

  默认跟踪和黑盒跟踪

  在sys.traces中的TraceID = 1的跟踪是SQL Server 默认跟踪,这个跟踪比较轻量级,一般监控服务器的启用停止,对象的创建和删除,日志和数据文件自动增长以及其他数据库的变化。(监控那些没事删错了表的人,是最好的,当然前提不要都使用一个帐号!)

  可以通过

  EXEC sp_configure 'default trace enabled',0;

  RECONFIGURE WITH OVERRIDE;

  来关闭默认跟踪。

  黑盒跟踪,就是可以帮助我们诊断数据库没事自个奔了的异常,在MSDN 搜索sp_create_trace的时候应该也发现了

  

  的选项,那么我们也能创建一个类似的存储过程来快速的创建黑盒跟踪,帮助我们诊断一些异常!

  CREATE PROCEDURE sp_trace_blackbox

  @FilePath nvarchar(260)

  AS

  BEGIN

  DECLARE @TraceID int,@MaxFileSize bigint

  SET @MaxFileSize = 25;

  EXEC sp_trace_create @TraceID OUTPUT,8,@FilePath,@MaxFileSize

  EXEC sp_trace_setstatus @TraceID,1;

  END

  我这里提供@FilePath = NULL参数,这个默认就保存在SQL Server的数据文件夹中。

分析SQL Server Profiler的监控方式的更多相关文章

  1. 通过SQL Server Profiler来监视分析死锁

    在两个或多个SQL Server进程中,每一个进程锁定了其他进程试图锁定的资源,就会出现死锁,例如,进程process1对table1持有1个排它锁(X),同时process1对table2请求1个排 ...

  2. SQL Server Profiler

    一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问 ...

  3. SQL Server Profiler使用教程,通俗易懂才是王道

    做开发,平时难免和数据库打交道,特别是写存储过程,对于我们这些不常写SQL的人来说是一件极其痛苦的事,每次写完运行总是有错,如果用的是本地数据库的话还好,可以在本机调试SQL,那如果在数据库在服务器上 ...

  4. SQL Server Profiler教程

    SQL Server Profiler是SQL Server企业版自带的一个sql 语句跟踪和分析工具,功能十分强大.熟练地使用它,对我们分析数据库性能问题很有帮助,比如当数据访问使用EF等ORM框架 ...

  5. SQL Server Profiler工具

    一.SQL Profiler工具简介 SQL Profiler是一个图形界面和一组系统存储过程,其作用如下: 图形化监视SQL Server查询: 在后台收集查询信息: 分析性能: 诊断像死锁之类的问 ...

  6. SQL2005 : 如何在SQL Server Profiler (事件查看器)中 跟踪查看死锁恢复

    SQL Profiler 通过 SQL Profiler 工具程序,可监控应用程序如何访问数据库引擎.普通来说,当系统性能需要优化或是应用程序对数据库访问的结果不合预期,都可以使用该工具确认视图问题所 ...

  7. SQL Server Profiler使用方法

    一.SQL Server Profiler使用方法 1.单击开始--程序--Microsoft SQL Server 2005--性能工具--SQL Server Profiler,如下图:   2. ...

  8. 降龙十八掌之一:(亢龙有悔)SQL Server Profiler和数据库引擎优化顾问

    简介 说到Sql的[性能工具]真是强大,SQL Server Profiler的中文意思是SQL Server事件探查,这个到底是做什么用的呢?我们都知道探查的意思大多是和监视有关,其实这个SQL S ...

  9. SQL Server性能优化(3)使用SQL Server Profiler查询性能瓶颈

    关于SQL Server Profiler的使用,网上已经有很多教程,比如这一篇文章:SQL Server Profiler:使用方法和指标说明.微软官方文档:https://msdn.microso ...

随机推荐

  1. 一些部署django用到的linux命令

    mv untitled45/ /1601F/wang/ 将XXXX移动到XXX,也可以用于给XXX重新命名 zip -r -q -o hello.zip  /1601F/3/untitled45 安静 ...

  2. adb端口占用及模拟器调试

    首先在使用ADB前所有手机辅助类软件 1.CMD命令窗口输入:adb nodaemon server .然后就会提示你哪个端口被占用了. 2.输入netstat -ano | findstr &quo ...

  3. HDU-5226 Tom and matrix(组合数求模)

    一.题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=5226 二.题意 给一个大矩阵,其中,$a[i][j] = C_i^j$.输入5个参数,$x_1, ...

  4. jquery对象和DOM对象转换

    DOM对象转换成jquery对象 var box = document.getElementById('box'); console.log($(box)); jquery对象转化成DOM对象 第一种 ...

  5. springBatch学习 batch的使用方式(5)

    首先讲一下batch框架提供的一组job执行的api 如下图 说明: 应用场景 包含三种 标准的web ,定时任务调度,命令行 1.命令行 通过命令行在单独的jvm中调用 进行批处理作业 spring ...

  6. selenium+python自动化77-autoit文件上传

    前言 关于非input文件上传,点上传按钮后,这个弹出的windows的控件了,已经跳出三界之外了,不属于selenium的管辖范围(selenium不是万能的,只能操作web上元素).autoit工 ...

  7. java递归之“二叉树”

    物有本末,事有始终,知所先后,则近道矣.-----题记. BotWong半路入行it做码农,也就半年时间,竟“不知天高地厚”地来到了深圳闯天下.一口气投了百个简历,一周后终于有公司邀约面试,除了基础的 ...

  8. FDStoredProc 存储过程控件 强

    //FireDAC FDStoredProc1->StoredProcName = "myReport1"; FDStoredProc1->Prepare(); FDS ...

  9. VB.NET 指针

    在.NET中,对指针指向数据的存储函数都封装在marshal类中,主要的函数包括:Copy.PtrToStringUni .PtrToStructure .OffsetOf.WriteXXX,Rrea ...

  10. ios开发者账号、证书相关内容

    背景:因为在实际测试中会涉及到不同的证书,而自己又对证书不了解,所以去查资料了解了一下不同证书的区别,如果有不对的地方,欢迎指正补充.   In House:所有手机都可以安装,但是不能上传到app ...