Baya Pavliashvili and Kevin Kline http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000409SQL SERVER 2000系統(tǒng)支持的跟蹤函數(shù)(二)
fn_trace_getfilterinfo 和 fn_trace_geteventinfo
這些函數(shù)可以用來檢索一個跟蹤的元數(shù)據(jù)(這些函數(shù)的輸出的含義是模糊的,如果你不熟悉跟蹤的事件標(biāo)志符和過慮的列的標(biāo)志符.你可以看看SQL SERVER的在線幫助 “sp_trace_setevent”)
這2個函數(shù)都是將跟蹤標(biāo)志符作為唯一的參數(shù). fn_trace_getfilterinfo返回指定跟蹤的過慮后的信息.舉例:假設(shè)我們限制跟PUBS數(shù)據(jù)庫,因為我們試圖解決該數(shù)據(jù)庫中一個運行很長時間的查詢的故障,我們可以如下運行該函數(shù):
SELECT * FROM :: fn_trace_getfilterinfo(1)
--Results:
columnID logical_operator comparison_operator value
---------- ---------------- ------------------- ---------
35 0 6 pubs
這個輸出告訴我們,我們指定的跟蹤過慮是在列為35(數(shù)據(jù)庫名)和沒有使用邏輯操作符("AND" or "OR") 因為只有一個條件.比較操作符是”LIEE”(=6)過濾的值是”PUBS”.
根據(jù)你應(yīng)用過慮的類型,你可以改變比較操作符.在許多案例中,你可以使用 LIKE或 NOT LIKE.而且,如果你限制跟蹤指定的處理或指定的數(shù)據(jù)庫,那么你可以指定"=", ">", "< >", "<", "> =", or "< ="等邏輯操作符.
備注:如果你通過SQL SERVER Profiler工具建立一個跟蹤,這個跟蹤會自動增加一個過濾器,不包括通過Profiler自己產(chǎn)生給SQL SERVER的跟蹤過濾語句.如果你喜歡了解Profiler工具,只要簡單的將過濾器設(shè)置為off.
fn_tracegeteventinfo 可以返回一個跟蹤的事件信息,有很多的跟蹤事件你可以指定.你指定的事件越多,就會有更多的信息被整理,因此要仔細.我勸告大家要了解每一個事件的含義并且選擇那些和你解決問題密切相關(guān)的事件. fn_tracegeteventinfo 是一個非常有用的函數(shù),當(dāng)你因為不同的目的要模擬運行多個跟蹤.
要獲得我們建立的跟蹤事件的標(biāo)志符,我們可以如下運行fn_tracegeteventinfo函數(shù):
SELECT DISTINCT eventid
FROM :: fn_trace_geteventinfo(1)
--Results:
eventid
-----------
12
37
40
41
42
43
這個結(jié)果告訴我們,這個跟蹤在檢測以下事件:
· 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
同樣的,我們可以運行相同的函數(shù),進行很小的改動就可以獲得一個跟蹤的所有數(shù)據(jù)列
SELECT DISTINCT columnid FROM :: fn_trace_geteventinfo(1)
--Results:
columnid
-----------
1
10
11
12
13
14
16
17
18
這里我們收集的典型數(shù)據(jù)用來性能調(diào)整,包括一個查詢的:正文數(shù)據(jù),程序名,登陸名,SPID,持續(xù)時間,開始結(jié)束時間,讀取,寫入和CPU占用.
使用系統(tǒng)提供的UDFs
現(xiàn)在你指定一些系統(tǒng)提供的UDFs,你可以通過這些系統(tǒng)函數(shù)建立自己的自定義函數(shù).其中有一個主要的限制是自定義函數(shù)無法調(diào)用存儲過程.但是自定義函數(shù)可以調(diào)用其他的自定義函數(shù).下面的UDF初始化fn_trace_geteventinfo函數(shù),使結(jié)果更方便閱讀:
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提供的非常有用的系統(tǒng)自定義函數(shù),希望大家喜歡并且研究其他的系統(tǒng)提供的自定義函數(shù).
下載: 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