使用存储过程代替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@maxfilesizeNULL
IF (@rc != 0GOTO error;

-- Client side File and Table cannot be scripted

-- Set the events
DECLARE @on AS BIT;
SET @on = 1;
EXEC sp_trace_setevent @traceid1015@on;
EXEC sp_trace_setevent @traceid108@on;
EXEC sp_trace_setevent @traceid1016@on;
EXEC sp_trace_setevent @traceid1048@on;
EXEC sp_trace_setevent @traceid101@on;
EXEC sp_trace_setevent @traceid1017@on;
EXEC sp_trace_setevent @traceid1010@on;
EXEC sp_trace_setevent @traceid1018@on;
EXEC sp_trace_setevent @traceid1011@on;
EXEC sp_trace_setevent @traceid1012@on;
EXEC sp_trace_setevent @traceid1013@on;
EXEC sp_trace_setevent @traceid1014@on;
EXEC sp_trace_setevent @traceid458@on;
EXEC sp_trace_setevent @traceid4516@on;
EXEC sp_trace_setevent @traceid4548@on;
EXEC sp_trace_setevent @traceid451@on;
EXEC sp_trace_setevent @traceid4517@on;
EXEC sp_trace_setevent @traceid4510@on;
EXEC sp_trace_setevent @traceid4518@on;
EXEC sp_trace_setevent @traceid4511@on;
EXEC sp_trace_setevent @traceid4512@on;
EXEC sp_trace_setevent @traceid4513@on;
EXEC sp_trace_setevent @traceid4514@on;
EXEC sp_trace_setevent @traceid4515@on;
EXEC sp_trace_setevent @traceid4115@on;
EXEC sp_trace_setevent @traceid418@on;
EXEC sp_trace_setevent @traceid4116@on;
EXEC sp_trace_setevent @traceid4148@on;
EXEC sp_trace_setevent @traceid411@on;
EXEC sp_trace_setevent @traceid4117@on;
EXEC sp_trace_setevent @traceid4110@on;
EXEC sp_trace_setevent @traceid4118@on;
EXEC sp_trace_setevent @traceid4111@on;
EXEC sp_trace_setevent @traceid4112@on;
EXEC sp_trace_setevent @traceid4113@on;
EXEC sp_trace_setevent @traceid4114@on;

-- Set the Filters
DECLARE @intfilter AS INT;
DECLARE @bigintfilter AS BIGINT;
-- Application name filter
EXEC sp_trace_setfilter @traceid1007, N'SQL Server Profiler%';
-- Database ID filter
EXEC sp_trace_setfilter @traceid300@dbid;

-- Set the trace status to start
EXEC sp_trace_setstatus @traceid1;

-- 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 20;
EXEC sp_trace_setstatus 22;

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

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

 

posted on 2011-04-13 15:04  Yuanet  阅读(1404)  评论(1编辑  收藏  举报

导航