SQL SERVER 2000系统支持的跟踪函数(二)
Baya Pavliashvili and Kevin Kline
http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000409
fn_trace_getfilterinfo 和 fn_trace_geteventinfo
这些函数可以用来检索一个跟踪的元数据(这些函数的输出的含义是模糊的,如果你不熟悉跟踪的事件标志符和过虑的列的标志符.你可以看看SQL SERVER的在线帮助 “sp_trace_setevent”)
这2个函数都是将跟踪标志符作为唯一的参数. fn_trace_getfilterinfo返回指定跟踪的过虑后的信息.举例:假设我们限制跟PUBS数据库,因为我们试图解决该数据库中一个运行很长时间的查询的故障,我们可以如下运行该函数:
SELECT * FROM :: fn_trace_getfilterinfo(1)
--Results:
columnID logical_operator comparison_operator value
---------- ---------------- ------------------- ---------
35 0 6 pubs
这个输出告诉我们,我们指定的跟踪过虑是在列为35(数据库名)和没有使用逻辑操作符("AND" or "OR") 因为只有一个条件.比较操作符是”LIEE”(=6)过滤的值是”PUBS”.
根据你应用过虑的类型,你可以改变比较操作符.在许多案例中,你可以使用 LIKE或 NOT LIKE.而且,如果你限制跟踪指定的处理或指定的数据库,那么你可以指定"=", ">", "< >", "<", "> =", or "< ="等逻辑操作符.
备注:如果你通过SQL SERVER Profiler工具建立一个跟踪,这个跟踪会自动增加一个过滤器,不包括通过Profiler自己产生给SQL SERVER的跟踪过滤语句.如果你喜欢了解Profiler工具,只要简单的将过滤器设置为off.
fn_tracegeteventinfo 可以返回一个跟踪的事件信息,有很多的跟踪事件你可以指定.你指定的事件越多,就会有更多的信息被整理,因此要仔细.我劝告大家要了解每一个事件的含义并且选择那些和你解决问题密切相关的事件. fn_tracegeteventinfo 是一个非常有用的函数,当你因为不同的目的要模拟运行多个跟踪.
要获得我们建立的跟踪事件的标志符,我们可以如下运行fn_tracegeteventinfo函数:
SELECT DISTINCT eventid
FROM :: fn_trace_geteventinfo(1)
--Results:
eventid
-----------
12
37
40
41
42
43
这个结果告诉我们,这个跟踪在检测以下事件:
· SQL: BatchCompleted—event id of 12
· SP: Recompile—event id of 37
· SQL: StatementStarting—event id of 40
· SQL: StatementCompleted—event id of 41
· SP: Starting—event id of 42
· SP: Completed—event id of 43
同样的,我们可以运行相同的函数,进行很小的改动就可以获得一个跟踪的所有数据列
SELECT DISTINCT columnid FROM :: fn_trace_geteventinfo(1)
--Results:
columnid
-----------
1
10
11
12
13
14
16
17
18
这里我们收集的典型数据用来性能调整,包括一个查询的:正文数据,程序名,登陆名,SPID,持续时间,开始结束时间,读取,写入和CPU占用.
使用系统提供的UDFs
现在你指定一些系统提供的UDFs,你可以通过这些系统函数建立自己的自定义函数.其中有一个主要的限制是自定义函数无法调用存储过程.但是自定义函数可以调用其他的自定义函数.下面的UDF初始化fn_trace_geteventinfo函数,使结果更方便阅读:
CREATE FUNCTION dbo.fn_GetTraceColumns (@trace_id INT)
RETURNS @TraceColumns TABLE (
column_id INT,
column_name VARCHAR(155)
)
AS
BEGIN
INSERT @TraceColumns (
column_id)
SELECT DISTINCT columnid FROM ::
fn_trace_geteventinfo(@trace_id)
UPDATE @TraceColumns
SET column_name =
CASE column_id
WHEN 1 THEN 'TextData'
WHEN 3 THEN 'DatabaseID'
WHEN 4 THEN 'TransactionID'
WHEN 6 THEN 'NTUserName'
-- similar statements omitted here - see Source
ELSE 'other'
END
RETURN
END
This function can be executed as follows:
SELECT * FROM dbo.fn_getTraceColumns(3)
概要
在这篇文章中,我介绍了SQL SERVER 2000提供的非常有用的系统自定义函数,希望大家喜欢并且研究其他的系统提供的自定义函数.
下载: TRACEUDFS.SQL
参考资源:
· 284790 INF: How to Create a SQL Server 2000 Trace
· 283786 INF: How to Monitor SQL Server 2000 Traces
· 270599 BUG: fn_trace_gettable Function Cannot Read Rollover Files 273972 Generated by SQL
· ProfilerHOW TO: Programmatically Load Trace Files into Tables
· 268591 PRB: ODBC Tracing to SQL.LOG Can Slow SQL Server or Consume All Disk Space
· 307786 INF: Tracing to Network Drive May Reduce SQL Server Throughput
· 286239 BUG: Replay Tool Uses LoginName Column for SETUSER Instead of DatabaseUserName Column
· Andrew Novick's "Find Out What They're Doing with fn_get_sql"—www.databasejournal.com/features/mssql/article.php/2189761