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