3 回答
TA贡献1803条经验 获得超3个赞
正如其他人所说,您可以使用SQL事件探查器,但您也可以通过sp_trace_ *系统存储过程利用它的功能。例如,这个SQL片段(至少2000年;我认为对于SQL 2008是相同的,但你必须仔细检查)所有查询的catch RPC:Completed和SQL:BatchCompleted事件需要超过10秒才能运行,并将输出保存到您可以在以后在SQL事件探查器中打开的跟踪文件:
DECLARE @TraceID INT
DECLARE @ON BIT
DECLARE @RetVal INT
SET @ON = 1
exec @RetVal = sp_trace_create @TraceID OUTPUT, 2, N'Y:\TraceFile.trc'
print 'This trace is Trace ID = ' + CAST(@TraceID AS NVARCHAR)
print 'Return value = ' + CAST(@RetVal AS NVARCHAR)
-- 10 = RPC:Completed
exec sp_trace_setevent @TraceID, 10, 1, @ON -- Textdata
exec sp_trace_setevent @TraceID, 10, 3, @ON -- DatabaseID
exec sp_trace_setevent @TraceID, 10, 12, @ON -- SPID
exec sp_trace_setevent @TraceID, 10, 13, @ON -- Duration
exec sp_trace_setevent @TraceID, 10, 14, @ON -- StartTime
exec sp_trace_setevent @TraceID, 10, 15, @ON -- EndTime
-- 12 = SQL:BatchCompleted
exec sp_trace_setevent @TraceID, 12, 1, @ON -- Textdata
exec sp_trace_setevent @TraceID, 12, 3, @ON -- DatabaseID
exec sp_trace_setevent @TraceID, 12, 12, @ON -- SPID
exec sp_trace_setevent @TraceID, 12, 13, @ON -- Duration
exec sp_trace_setevent @TraceID, 12, 14, @ON -- StartTime
exec sp_trace_setevent @TraceID, 12, 15, @ON -- EndTime
-- Filter for duration [column 13] greater than [operation 2] 10 seconds (= 10,000ms)
declare @duration bigint
set @duration = 10000
exec sp_trace_setfilter @TraceID, 13, 0, 2, @duration
您可以在联机丛书中找到每个跟踪事件,列等的ID; 只搜索sp_trace_create,sp_trace_setevent和sp_trace_setfiler sprocs。然后,您可以按如下方式控制跟踪:
exec sp_trace_setstatus 15, 0 -- Stop the trace
exec sp_trace_setstatus 15, 1 -- Start the trace
exec sp_trace_setstatus 15, 2 -- Close the trace file and delete the trace settings
...其中'15'是跟踪ID(由sp_trace_create报告,第一个脚本在上面启动)。
您可以检查以查看正在运行的跟踪:
select * from ::fn_trace_getinfo(default)
我唯一要注意的是 - 我不知道这会给你的系统增加多少负载; 它会添加一些,但“some”的大小可能取决于服务器的繁忙程度。
- 3 回答
- 0 关注
- 4024 浏览
添加回答
举报