使用存储过程代替SQL SERVER Profilter进行跟踪

进行数据跟踪会影响数据库服务器的性能,为了尽量减少这方面的影响。使用存储过程也可以进行跟踪,并将结果输出到磁盘文件上,其性能消耗要比SQL SERVER Profilter要小很多。

采用T-SQL代替SQL SERVER Profilter进行跟踪的具体实现方法如下:

1、在master数据库中创建sp_perfworkload_trace_start存储过程

View Code
SET  NOCOUNT  ON ;
USE  master;
GO

IF   OBJECT_ID ( ' dbo.sp_perfworkload_trace_start ' IS   NOT   NULL
  
DROP   PROC  dbo.sp_perfworkload_trace_start;
GO

CREATE   PROC  dbo.sp_perfworkload_trace_start
  
@dbid        AS   INT ,
  
@tracefile   AS   NVARCHAR ( 254 ),
  
@traceid     AS   INT  OUTPUT
AS
--  Create a Queue
DECLARE   @rc            AS   INT ;
DECLARE   @maxfilesize   AS   BIGINT ;

SET   @maxfilesize   =   5 ;

EXEC   @rc   =  sp_trace_create  @traceid  OUTPUT,  0 @tracefile @maxfilesize NULL
IF  ( @rc   !=   0 GOTO  error;

--  Client side File and Table cannot be scripted

--  Set the events
DECLARE   @on   AS   BIT ;
SET   @on   =   1 ;
EXEC  sp_trace_setevent  @traceid 10 15 @on ;
EXEC  sp_trace_setevent  @traceid 10 8 @on ;
EXEC  sp_trace_setevent  @traceid 10 16 @on ;
EXEC  sp_trace_setevent  @traceid 10 48 @on ;
EXEC  sp_trace_setevent  @traceid 10 1 @on ;
EXEC  sp_trace_setevent  @traceid 10 17 @on ;
EXEC  sp_trace_setevent  @traceid 10 10 @on ;
EXEC  sp_trace_setevent  @traceid 10 18 @on ;
EXEC  sp_trace_setevent  @traceid 10 11 @on ;
EXEC  sp_trace_setevent  @traceid 10 12 @on ;
EXEC  sp_trace_setevent  @traceid 10 13 @on ;
EXEC  sp_trace_setevent  @traceid 10 14 @on ;
EXEC  sp_trace_setevent  @traceid 45 8 @on ;
EXEC  sp_trace_setevent  @traceid 45 16 @on ;
EXEC  sp_trace_setevent  @traceid 45 48 @on ;
EXEC  sp_trace_setevent  @traceid 45 1 @on ;
EXEC  sp_trace_setevent  @traceid 45 17 @on ;
EXEC  sp_trace_setevent  @traceid 45 10 @on ;
EXEC  sp_trace_setevent  @traceid 45 18 @on ;
EXEC  sp_trace_setevent  @traceid 45 11 @on ;
EXEC  sp_trace_setevent  @traceid 45 12 @on ;
EXEC  sp_trace_setevent  @traceid 45 13 @on ;
EXEC  sp_trace_setevent  @traceid 45 14 @on ;
EXEC  sp_trace_setevent  @traceid 45 15 @on ;
EXEC  sp_trace_setevent  @traceid 41 15 @on ;
EXEC  sp_trace_setevent  @traceid 41 8 @on ;
EXEC  sp_trace_setevent  @traceid 41 16 @on ;
EXEC  sp_trace_setevent  @traceid 41 48 @on ;
EXEC  sp_trace_setevent  @traceid 41 1 @on ;
EXEC  sp_trace_setevent  @traceid 41 17 @on ;
EXEC  sp_trace_setevent  @traceid 41 10 @on ;
EXEC  sp_trace_setevent  @traceid 41 18 @on ;
EXEC  sp_trace_setevent  @traceid 41 11 @on ;
EXEC  sp_trace_setevent  @traceid 41 12 @on ;
EXEC  sp_trace_setevent  @traceid 41 13 @on ;
EXEC  sp_trace_setevent  @traceid 41 14 @on ;

--  Set the Filters
DECLARE   @intfilter   AS   INT ;
DECLARE   @bigintfilter   AS   BIGINT ;
--  Application name filter
EXEC  sp_trace_setfilter  @traceid 10 0 7 , N ' SQL Server Profiler% ' ;
--  Database ID filter
EXEC  sp_trace_setfilter  @traceid 3 0 0 @dbid ;

--  Set the trace status to start
EXEC  sp_trace_setstatus  @traceid 1 ;

--  Print trace id and file name for future references
PRINT   ' Trce ID:  '   +   CAST ( @traceid   AS   VARCHAR ( 10 ))
  
+   ' , Trace File:  '''   +   @tracefile   +   '''' ;

GOTO  finish;

error:
PRINT   ' Error Code:  '   +   CAST ( @rc   AS   VARCHAR ( 10 ));

finish:
GO

2、在需要跟踪的数据库中执行如下SQL,设置跟踪的数据和输出路径并开始跟踪:

DECLARE   @dbid   AS   INT @traceid   AS   INT ;
SET   @dbid   =   DB_ID ( );
EXEC  dbo.sp_perfworkload_trace_start
@dbid   =   @dbid ,
@tracefile   =   ' c:\20131212 ' ,
@traceid    =   @traceid  OUTPUT;

3、需要结束跟踪时运行如下代码,最后会生成.trc格式的文件:

EXEC  sp_trace_setstatus  2 0 ;
EXEC  sp_trace_setstatus  2 2 ;

4、跟踪文件可以直接使用TSQL语句查询出来,也可以复制到其它机器上用SQL SERVER Profilter打开进行查看,或者将数据加载到表中进行分析:

SELECT * FROM sys.fn_trace_gettable( ' c:\2013121201.trc ', NULL) AS t ORDER BY StartTime

 

你可能感兴趣的:(SQL Server)