sql server 2000系統支持的跟蹤函數(一)
baya pavliashvili and kevin kline
http://msdn.microsoft.com/library/default.asp?url=/nhp/default.asp?contentid=28000409
 
你們大部分人可能已經在sql server中建立自己的用戶定義函數(udf),但是你知道么?微軟公司已經集成了大量自己的udfs,特別是在最新發布的sp3中.在這篇文章中 baya pavliashvili和kevin kline系統地研究了關于sql server跟蹤部分的udf.你們中的一些人也許想閱讀以前sql server professional的一篇關于傳統udfs的文章,比如andrew zanevsky's 2000年9月的專欄 ("granting wishes with udf"), andrew zanevsky and anton jiline's  2001年10月的文章 ("udf performance… or lack of it"), 或 jimmy nilsson's  2003年7月的文章("another udf: global constants").
udfs是sql server 2000期待已久的附加功能, udfs典型的應用是dbas和開發者用來模塊化代碼和間或用來提高性能.在這篇文章中,我們將從零開始了解sql server系統提供的udfs,可以允許dba進行跟蹤管理.
雖然系統提供的用戶定義函數聽起來有一點矛盾,但微軟還是集成大量的內部的udfs(只讀,系統提供).同時,盡管udfs這個特性在sql server 2000最初發布是就提供了,不過我們發現只是在sp3中微軟才因為自己的目的而大量使用,所有系統提供的udfs函數都是以’fn_’開始并且保存在master數據庫中.
比較系統提供的和標準的udf
如果你熟悉udfs,你也許知道udf是不能修改固定表的記錄,典型的應用是:讀取數據,修改表變量的數據,返回數據.而且udfs可以運行擴展存儲過程和系統提供的自定義函數.事實上有很多的系統提供的自定義函數只是簡單的調用一個擴展存儲過程.[ 擴展存儲過程通常是有c++寫的dll文件,你可以看paul storer-martin's在2002年7月和8月的文章"playing the ods"],因此閱讀用t-sql寫的udf相同功能的代碼不是更好么? 系統提供的自定義函數和用戶的自定義函數在運行時有輕微的差別:典型的自定義函數(udfs)可以向這樣調用:
select column_list 
from owner_name.udf_name (@parameter1, … @parametern)
系統提供的自定義函數需要在from后面加二個冒號(::),同時你不必指定該功能的所有者:
select column_list  
from  :: fn_systemsuppliedudf 
(@parameter1, … @parametern)
比如: 系統提供的自定義函數fn_helpcollations()可以返回sql server 2000支持的所有字符集,我們可以這樣執行:
select * from :: fn_helpcollations()
用于跟蹤的自定義函數(udfs)
一條跟蹤捕獲的t-sql語句發給(或運行一個存儲過程在)指定的sql server的實列并且保存為一個*.trc的文件.sql server的跟蹤可以通過profiler工具或運行系統的存儲過程sp_trace_create建立并且可以指定許多過慮的標準來限制輸出文件.在這篇文章中,我們主要針對跟蹤功能的系統提供的自定義函數.
fn_trace_gettable
fn_trace_gettable() 需要二個參數: 初始化的跟蹤文件名(.trc)和跟蹤文件的個數.當你建立一個跟蹤,你可以配置sql server限制跟蹤文件的大小.當跟蹤文件到達指定的大小,sql server會字段產生一個新的”滾動的”跟蹤文件. fn_trace_gettable()函數的第二個參數是”滾動的”跟蹤文件的個數,這是在指定第一個參數時開始的.
如果你喜歡將跟蹤的新年保存在數據庫中,你可以簡單地運行一個查詢,通過fn_trace_gettable 將跟蹤文件保存為一個數據表,比如:
select * 
into dbo.my_trace_table
from :: fn_trace_gettable
('c:/trace_file.trc', default)
而且,可以非常方便直接查詢,搜索一些特殊含義的字符串.在我們的測試環境中,所有的用戶定義的存儲過程以”usp”開始,因此我們可以運行一個查詢,搜索持續時間超過3000ms的記錄:
select textdata, duration 
from :: 
  fn_trace_gettable('c:/trace_file.trc', default)
where textdata like '%usp%'
and duration > 3000
通過更加復雜的查詢,我們可以精練select語句來確定哪些查詢一致運行地比較慢還是只在高峰期.
fn_trace_getinfo
這個系統提供的自定義函數可以得到一個跟蹤的高級別信息或在一個sql server上運行的所有正在運行的跟蹤.這個函數只有一個參數—跟蹤的編號(trace id) 
為了限制一個跟蹤的信息,你必須指定跟蹤標志符.你也可以指定default或”0”,作為跟蹤標志符,這樣可以獲得所有的運行的跟蹤信息.sql server在建立跟蹤時給每一個跟蹤分配一個跟蹤標志符,如果你不指定你要查詢的跟蹤標志符,簡單的以參數”0”運行該系統函數,然后你可以限制跟蹤輸出你感興趣的內容. fn_trace_getinfo系統函數的輸出描述如表一:
表 1. f fn_trace_getinfo的輸出.
列名
描述
traceid
此跟蹤的 id.可以被用來通過系統存儲過程來管理跟蹤
property
跟蹤的屬性,由下列整數表示: 
1 – 跟蹤選項(請參見 sp_trace_create 中的 @options)
2 – filename
3 – maxsize
4 – stoptime
5 – 當前跟蹤狀態
value
有關指定跟蹤的屬性的信息。
跟蹤的選項可以通過系統存儲過程sp_trace_create來指定(看表2)
表 2. 跟蹤的選項可以通過系統存儲過程sp_trace_create來指定
選項名
選項值
描述
trace_produce_rowset
1
跟蹤將產生一個行集
trace_file_rollover
2
當達到 max_file_size 時,將關閉當前跟蹤文件并創建新文件.sql server 會自動為每個文件增加序列編號(1,2,3….)
shutdown_on_error
4
如果不能將跟蹤寫入文件,則 sql server 將關閉。
trace_produce_blackbox
8
如果這個選項被選中,sql server的最后 5 mb 跟蹤信息記錄將由服務器保存
下面我們看一個實列來了解fn_trace_getinfo是如何工作的.設想我們通過下面的查詢建立一個跟蹤:
/* declare a variable to hold trace id */
declare @trace_id int
/* create the trace */
exec sp_trace_create      
  @traceid = @trace_id  output, 
       @options =  2  ,
  @tracefile =  n'e:/trace_file.trc' , 
  @maxfilesize = 5, 
  @stoptime = null
/* start the trace we just created. 
by default the trace is stopped at creation
*/
exec sp_trace_setstatus @trace_id, 1
/* return the trace identifier*/
select 'trace id is: ' + cast(@trace_id as varchar(4))
--result: 
-------------------------
trace id is: 2
現在我們可以用fn_trace_getinfo 來獲得相應跟蹤的信息
select * from :: fn_trace_getinfo(2)
查詢的結果在表 3.
表3. fn_trace_getinfo查詢的結果.
traceid
property
value
2
1
2
2
2
e:/trace_file.trc
2
3
5
2
4
null
2
5
1
這個輸出告訴我們,有一個正在運行的跟蹤,自動增長到5mb后會自動產生另外一個文件.沒有指定跟蹤停止時間( property = 4 ) ,因此該跟蹤會運行直到sql server服務停止或通過系統存儲過程sp_trace_setstatus停止跟蹤.
菜鳥學堂: