--收藏,太有用了 这个月新系统正式上线,半个月来出现很多问题,麻烦!真是麻烦!麻烦不断啊!最要命的是公司的DBA因为需要参与新项目的设计居然把所有问题交我解决,自己一走了知。我本就是一懒人,什么事情都要重复做可不行,是什么原因出现的错误我分析不出来,可是我能把所有的语句都跟踪记录下来。 SQL Server Profiler 没错!就是它了,这是这半个月来我每天都要手点一下选择一个模板出来运行,这也够无聊的了,交给 SQLAgent 出做不是很好吗,为什么一定要我去每天点呢? 可惜的很 SQLAgent 里面没有那个选项能做跟踪的,想想实在没有办法看了一天的联机帮助,参考了几个例子总算是写了个存储过程,勉强是做出来了,看来下面的半个月里我不用每天都打开 SQL Server Profiler 点一点鼠标做无聊的事情了。高兴! 首先还是先介绍一下系统里面与 SQL Server Profiler 有关的几个存储过程和函数,自己写的例子在下面。(查看示例代码) 下面的说明都是从联机帮助上面Copy下来的,个人整理了一下,然后加了一点点自己的理解。 sp_trace_create创建跟踪定义。新的跟踪将处于停止状态。 语法:
参数: @traceid @options
@tracefile @maxfilesize @stoptime @filecount 返回值:
sp_trace_setevent在跟踪中添加或删除事件或事件列。只能对已停止的现有跟踪(status 为 0)执行 sp_trace_setevent。如果对不存在的或其 status 值不为 0 的跟踪执行此存储过程,则将返回错误。 语法:
参数: @traceid @eventid
@columnid
@on sp_trace_setfilter将筛选应用于跟踪。只能对已停止的现有跟踪(status 的值为 0)执行 sp_trace_setfilter。如果对不存在的跟踪或其 status 值不为 0 的跟踪执行此存储过程,则 SQL Server 将返回错误。 语法:
@traceid @columnid @logical_operator @comparison_operator
@value sp_trace_setstatus修改指定跟踪的当前状态。 语法:
@traceid @status
注意:在关闭跟踪前首先必须先停止它。在查看跟踪前首先必须先停止并关闭它。如果要删除则将状态指定为2。 sp_trace_generateevent创建用户定义事件。 fn_trace_gettable以表格格式返回一或多个跟踪文件的内容。 语法:
@filename @number_files fn_trace_getinfo返回有关指定跟踪或全部现有跟踪的信息。 语法:
@trace_id fn_trace_geteventinfo返回有关所跟踪的事件的信息。 fn_trace_getfilterinfo返回有关应用于指定跟踪的筛选器的信息。 以上基本是从联机帮助上Copy的,都是理论,下面是我自己写的应用。 示例:创建一个新跟踪,这个是用代码建的,效果和在 SQL Server Profiler 中用鼠标点出来的一样。 SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER ON GO --建立人: 高升 --建立日期:2007/08/12 --修改日期: --功能目的:创建一个新跟踪,由 SQL Server Agent 每天调用执行一次 --注意: 因为文件名的关系,一天只能执行一次,只跟踪了8个小时 CREATE PROCEDURE [dbo].[BeginNewTrack] AS DECLARE @TraceID int --跟踪编号 DECLARE @fileAddress nvarchar(245) --跟踪文件的地址加文件名 DECLARE @maxFileSize bigint --跟踪文件的最大文件大小 DECLARE @endDateTime datetime --跟踪结束的时间 DECLARE @fileCount int --跟踪文件的最大个数 DECLARE @result int --建立新跟踪的返回值 --跟踪文件保存在C盘我的文档下面,文件名加上当天的年月日 SET @fileAddress = N'C:/Documents and Settings/Administrator/My Documents/TraceSQL' + Convert(char(8),GetDate(),112) SET @maxFileSize = 200 --每个跟踪文件最大200M SET @endDateTime = GetDate() + 0.041666 * 8 --跟踪8小时后结束 SET @fileCount = 5 --此处未使用此参数,不限定文件个数 --定义一个跟踪 EXECUTE @result = sp_trace_create @TraceID output, 2, @fileAddress, @maxFileSize, @endDateTime IF (@result = 0) BEGIN DECLARE @on bit -- 1 sp_trace_setevent 必要参数 SET @on = 1 --设定需要跟踪的事件,跟踪远程调用存储过程 EXECUTE sp_trace_setevent @TraceID, 10, 1, @on --TextData EXECUTE sp_trace_setevent @TraceID, 10, 8, @on --HostName EXECUTE sp_trace_setevent @TraceID, 10, 10, @on --ApplicationName EXECUTE sp_trace_setevent @TraceID, 10, 11, @on --LoginName EXECUTE sp_trace_setevent @TraceID, 10, 13, @on --Duration EXECUTE sp_trace_setevent @TraceID, 10, 14, @on --StartTime EXECUTE sp_trace_setevent @TraceID, 10, 35, @on --DatabaseName --跟踪 Transact-SQL EXECUTE sp_trace_setevent @TraceID, 12, 1, @on EXECUTE sp_trace_setevent @TraceID, 12, 8, @on EXECUTE sp_trace_setevent @TraceID, 12, 10, @on EXECUTE sp_trace_setevent @TraceID, 12, 11, @on EXECUTE sp_trace_setevent @TraceID, 12, 13, @on EXECUTE sp_trace_setevent @TraceID, 12, 14, @on EXECUTE sp_trace_setevent @TraceID, 12, 35, @on --设定需要过滤的条件,不跟踪 SQL Server Profiler 和 SQL Server Agent EXECUTE sp_trace_setfilter @TraceID, 10, 0, 7, N'SQL%' --过滤开发者使用MS工具产生的语句,如SQL Server Management Studio和查询分析器等 -- EXECUTE sp_trace_setfilter @TraceID, 10, 0, 7, N'Microsoft%' --过滤执行时间小于1秒的语句 DECLARE @value bigint --毫秒数 SET @value = 1000 EXECUTE sp_trace_setfilter @TraceID, 13, 0, 2, @value --启用跟踪 EXECUTe sp_trace_setstatus @TraceID, 1 PRINT @TraceID END ELSE BEGIN PRINT ('未能创建跟踪') END RETURN @TraceID --将新跟踪的编号做为存储过程的返回值 GO 下面定义的这个函数是为了方便返回跟踪信息建立的。 SET ANSI_NULLS OFF GO SET QUOTED_IDENTIFIER ON GO --建立人: 高升 --建立日期:2007/08/12 --修改日期: --功能目的:返回指定日期的跟踪记录 --参数: 日期格式yyyyMMdd CREATE FUNCTION [dbo].[ReadTrackFile] (@readDate char(8)) RETURNS @traceLog table( [DBName] nvarchar(50), [TextData] nvarchar(max), [Duration] bigint, [StartTime] datetime, [LoginName] nvarchar(50), [HostName] nvarchar(256)) AS BEGIN DECLARE @fileAddress nvarchar(245) --文件地址 SET @fileAddress = N'C:Documents and SettingsAdministratorMy DocumentsTraceSQL' + @readDate + '.trc' INSERT INTO @traceLog SELECT DataBaseName,TextData,Duration,StartTime,LoginName,HostName FROM fn_trace_gettable(@fileAddress, default) --SPID,ApplicationName,EventClassselect RETURN END 跟踪开始后随时可以查看跟踪到的信息,下面是查看示例。 --查看 8/12 执行时间大于10秒的跟踪信息 SELECT * FROM ReadTrackFile('20070812') WHERE Duration > 10000 --查看 8/12 用户 GaoS 执行的所有语句 SELECT * FROM ReadTrackFile('20070812') WHERE LoginName = 'GaoS' 如果要删除跟踪需要先将跟踪停止,然后才能删除,就是将状态改为2。另外跟踪定义的结束时间到了以后也会自动删除。 --fn_trace_getinfo 参数为0可以看到所以的跟踪,也可指定traceID SELECT * FROM fn_trace_getinfo (0) --停止 ID 为 2 的跟踪 EXECUTE sp_trace_setstatus 2, 0 --删除 ID 为 2 的跟踪 EXECUTE sp_trace_setstatus 2, 2 我这人真的很懒,这篇文章对大部分人来说一点意思都没有。因为使用 SQL Server Profiler 定义跟踪要简单直观的多了,写这个存储过程完全是没事找事。不过对我来说就算是总学习吧,毕竟我现在对 SQL Server Profiler 的使用更清楚了。好了现在把这个存储过程交给 Sql Server Agent 去做吧,我每天可以少点一下鼠标了,呵呵! 跟踪这些 Sql 语句对我们优化程式,提升数据库的性能还是很有帮助的,至于如何优化我还在学习中。毕竟这些性能分析是更高层次的 DBA 所做的工作,我现在只算是个学徒罢了。现在重主要的就是把技术含量低的重复工作交给电脑自己去做,让我有更多时间去研究更复杂的东西。 |
|