自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL Server 2008使用擴(kuò)展事件進(jìn)行高級(jí)故障排除

數(shù)據(jù)庫 SQL Server
今天我們將介紹的是SQL Server 2008使用擴(kuò)展事件進(jìn)行高級(jí)故障排除,希望對(duì)大家有所幫助。

全世界的 SQL Server DBA 都有一個(gè)似乎永遠(yuǎn)無法解決的難題:故障排除,其中所執(zhí)行的絕大多數(shù)故障排除都是為了查找某種性能問題。即使是最精心構(gòu)建并經(jīng)過測(cè)試的應(yīng)用程序系統(tǒng)都會(huì)隨著時(shí)間的推移發(fā)生變化,進(jìn)而導(dǎo)致可能出現(xiàn)重大的性能問題。

例如,工作負(fù)載可能會(huì)發(fā)生變化(如并發(fā)用戶的數(shù)量、需要執(zhí)行的查詢數(shù)以及需要運(yùn)行的新月末報(bào)告)、需要處理的數(shù)據(jù)量可能會(huì)增加、運(yùn)行系統(tǒng)的硬件平臺(tái)可能會(huì)發(fā)生變化(如處理器內(nèi)核數(shù)量、可用的服務(wù)器內(nèi)存數(shù)量以及 I/O 子系統(tǒng)容量),另外還可能引入新的并發(fā)工作負(fù)載(如事務(wù)復(fù)制、數(shù)據(jù)庫鏡像以及更改數(shù)據(jù)捕獲)。

但這些并不是問題的全部。在設(shè)計(jì)和測(cè)試應(yīng)用程序系統(tǒng)時(shí),設(shè)計(jì)中往往會(huì)出現(xiàn)很多意外的問題,這些也都需要進(jìn)行故障排除。顯然,無論在應(yīng)用程序生命周期的哪個(gè)階段發(fā)現(xiàn)問題,都必須通過故障排除來找出原因并給出解決方案。

在一個(gè)復(fù)雜的應(yīng)用程序系統(tǒng)中,可能會(huì)有許多需要進(jìn)行分析的硬件和軟件組件,但我關(guān)注的只是 SQL Server。拋開各種性能故障排除方法不談(這些屬于本文以外的內(nèi)容),您對(duì) SQL Server 進(jìn)行故障排除時(shí)都需要哪些工具呢?

SQL Server 2005 中的故障排除

在最近的幾個(gè) SQL Server 版本中,可用于性能故障排除的工具大為增加。SQL Server 包含大量的 DBCC(數(shù)據(jù)庫控制臺(tái)命令)命令,可用于深入了解數(shù)據(jù)庫引擎各個(gè)部分的當(dāng)前狀況。此外還包括 SQL Server Profiler,它可以通過編程的方式使用底層 SQL Trace 機(jī)制。

盡管 SQL Server 為進(jìn)行故障排除不斷加以改進(jìn),但這些選擇依然存在某些問題。DBCC 輸出的后處理顯得有些笨拙,因?yàn)楸仨毾葘⑤敵鼋Y(jié)果轉(zhuǎn)儲(chǔ)到一個(gè)臨時(shí)表中然后才能對(duì)其進(jìn)行操作。而且,如果配置不當(dāng),在運(yùn)行 SQL Trace/Profiler 時(shí)可能會(huì)導(dǎo)致性能急劇降低(例如在某個(gè)繁忙系統(tǒng)中跟蹤所有“Lock:Acquired”(鎖定:獲得)和“Lock:Released”(鎖定:釋放)事件但卻忘記篩選該事件的 DatabaseId 和 ObjectId 列)。圖 1 中的屏幕快照顯示的是用于配置篩選器以進(jìn)行新跟蹤的對(duì)話框。

 

圖 1 在 SQL Server 2008 Profiler 中配置篩選器

SQL Server 2005 添加了動(dòng)態(tài)管理視圖和函數(shù)(統(tǒng)稱為 DMV)幫助從數(shù)據(jù)庫引擎獲取信息。DMV 廢棄了某些 DBCC 命令、系統(tǒng)表和存儲(chǔ)過程,同時(shí)公開了許多新的引擎工作區(qū)域。這些 DMV 是一些功能強(qiáng)大且可以組合的命令,可用在復(fù)雜的 T-SQL 語句中以篩選 DMV 結(jié)果并進(jìn)行后處理。

例如,圖 2 中所示的代碼只返回?cái)?shù)據(jù)庫中所有索引的葉級(jí)碎片和頁密度(均已圓整),它還包括一個(gè)碎片級(jí)篩選器。使用原來的 DBCC SHOWCONTIG 命令則很難實(shí)現(xiàn)這一點(diǎn)。(有關(guān) DMV 的詳細(xì)信息,請(qǐng)參閱“動(dòng)態(tài)管理視圖和函數(shù) (Transact-SQL)。”此外,SQL Server 2005 還添加了大量可用于故障排除的其它功能,包括 DDL(數(shù)據(jù)定義語言)觸發(fā)器和事件通知。 

 圖 2 使用 DMV 獲取功能強(qiáng)大的結(jié)果

  1. SELECT 
  2.   OBJECT_NAME (ips.[object_id]) AS 'Object Name',  
  3.   si.name AS 'Index Name',  
  4.   ROUND (ips.avg_fragmentation_in_percent, 2) AS 'Fragmentation',  
  5.   ips.page_count AS 'Pages',  
  6.   ROUND (ips.avg_page_space_used_in_percent, 2) AS 'Page Density' 
  7. FROM sys.dm_db_index_physical_stats (  
  8.   DB_ID ('SQLskillsDB'), NULLNULLNULL'DETAILED') ips  
  9. CROSS APPLY sys.indexes si  
  10. WHERE 
  11.   si.object_id = ips.object_id  
  12.   AND si.index_id = ips.index_id  
  13.   AND ips.index_level = 0 -- only the leaf level  
  14.   AND ips.avg_fragmentation_in_percent > 10; -- filter on fragmentation  
  15. GO 

Microsoft 內(nèi)部的各種團(tuán)隊(duì)也提供了許多有用的性能故障排除工具,如 SQLdiag 實(shí)用工具、SQL Server RML 實(shí)用工具、SQL Server 2005 性能儀表板報(bào)告和DMVStats。此外還有用于 SQL Server 2005 的Windows 事件跟蹤 (ETW) 提供程序,它可將 SQL Trace 事件與 Windows 其它部分中的事件集成在一起。

盡管 SQL Server 2005 在增強(qiáng) DBA 對(duì)數(shù)據(jù)庫引擎進(jìn)行故障排除的能力方面取得了長(zhǎng)足進(jìn)步,但仍存在許多 DBA 幾乎無法有效進(jìn)行故障排除的情況。一個(gè)經(jīng)常被引用的示例就是某些查詢會(huì)使用過量的 CPU 資源,但 DMV 卻無法提供足夠的信息來確定究竟是哪些查詢導(dǎo)致了這些問題。但與 SQL Server 2005 不同,SQL Server 2008 可通過一個(gè)名為 SQL Server 擴(kuò)展事件的新功能來突破此類限制。

擴(kuò)展事件

擴(kuò)展事件系統(tǒng)的功能遠(yuǎn)遠(yuǎn)超出了 SQL Server 在以前提供的任何事件跟蹤和故障排除機(jī)制。在我看來,擴(kuò)展事件系統(tǒng)具有如下特色:

事件同步觸發(fā),但可同步或異步進(jìn)行處理。

任何目標(biāo)都可以消耗任何事件,而任何動(dòng)作都可以與任何事件配對(duì),從而能夠更深入地監(jiān)控系統(tǒng)。

“智能”謂詞允許您使用布爾邏輯來構(gòu)建復(fù)雜的規(guī)則。

可以使用 Transact-SQL 對(duì)擴(kuò)展事件會(huì)話進(jìn)行全面控制。

可以監(jiān)控性能關(guān)鍵代碼而不會(huì)對(duì)性能產(chǎn)生影響。

在深入講述之前,我先花一些時(shí)間來定義一些新術(shù)語。

事件 事件是指代碼中定義的點(diǎn)。此類示例包括:T-SQL 語句完成執(zhí)行時(shí)的點(diǎn)或結(jié)束獲取鎖定時(shí)的點(diǎn)。每個(gè)事件都有一個(gè)定義的負(fù)載(該事件返回的列的集合),它是使用 ETW 模型(其中每個(gè)事件都返回一個(gè)通道和關(guān)鍵字作為負(fù)載的一部分)來定義的,以便能夠與 ETW 集成。SQL Server 2008 最初提供 254 個(gè)定義的事件,預(yù)計(jì)在今后還會(huì)增加。

使用下列代碼可以查看這些定義事件的列表: 、

  1. SELECT xp.[name], xo.*  
  2. FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp  
  3. WHERE xp.[guid] = xo.[package_guid]  
  4.   AND xo.[object_type] = 'event' 
  5. ORDER BY xp.[name]; 

使用下列代碼可以查找某個(gè)特定事件的負(fù)載:  

  1. SELECT * FROM sys.dm_xe_object_columns  
  2.   WHERE [object_name] = 'sql_statement_completed';  
  3. GO 
請(qǐng)注意,擴(kuò)展事件系統(tǒng)包含一組說明性的 DMV,用來描述所有事件、目標(biāo)等。有關(guān)詳細(xì)內(nèi)容,請(qǐng)參閱“SQL Server 擴(kuò)展事件動(dòng)態(tài)管理視圖。”

謂詞 謂詞是指在事件消耗前利用一組邏輯規(guī)則來篩選事件的方法。謂詞可以很簡(jiǎn)單,如檢查事件負(fù)載中的其中一個(gè)返回列是否為某個(gè)特定值(例如,通過對(duì)象 ID 來篩選“鎖定-獲得”事件)。

它們還具有一些高級(jí)功能,如統(tǒng)計(jì)會(huì)話期間某個(gè)特定事件發(fā)生的次數(shù)、僅允許事件在發(fā)生一次后消耗,或者動(dòng)態(tài)更新謂詞本身以抑制包含類似數(shù)據(jù)的事件的消耗。

謂詞可以使用布爾邏輯來編寫,以使其能夠盡可能走捷徑。這使得只需執(zhí)行最少數(shù)量的同步處理即可確定是否需要消耗事件。

動(dòng)作 動(dòng)作是指在消耗某個(gè)事件前同步執(zhí)行的一組命令。任何動(dòng)作都可以被鏈接到任何事件。它們通常會(huì)收集大量數(shù)據(jù)并追加到事件負(fù)載中(如 T-SQL 堆?;虿樵儓?zhí)行計(jì)劃)或

行某個(gè)被追加到事件負(fù)載中的計(jì)算。

由于執(zhí)行這些動(dòng)作可能需要極高的代價(jià),因此事件的動(dòng)作僅在所有謂詞都計(jì)算完畢后才執(zhí)行,如果在隨后確定該事件不會(huì)被消耗,則將不會(huì)有同步執(zhí)行某個(gè)動(dòng)作的點(diǎn)。使用下列代碼可找到預(yù)定義動(dòng)作的列表:

  1. SELECT xp.[name], xo.*  
  2. FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp  
  3. WHERE xp.[guid] = xo.[package_guid]  
  4.   AND xo.[object_type] = 'action' 
  5. ORDER BY xp.[name]; 

目標(biāo) 目標(biāo)只提供一種消耗事件的方法,任何目標(biāo)都可以消耗任何事件(或至少可以在目標(biāo)空閑時(shí)對(duì)事件進(jìn)行處理 — 如獲取非審計(jì)事件的審計(jì)目標(biāo))。目標(biāo)可以同步(例如,觸發(fā)事件的代碼等待該事件被消耗)或異步消耗事件。

目標(biāo)的范圍從簡(jiǎn)單的使用者(如事件文件和環(huán)緩沖區(qū))直到能夠執(zhí)行事件配對(duì)操作的復(fù)雜使用者。使用下列代碼可以找到可用目標(biāo)的列表:

  1. SELECT xp.[name], xo.*  
  2. FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp  
  3. WHERE xp.[guid] = xo.[package_guid]  
  4.   AND xo.[object_type] = 'target' 
  5. ORDER BY xp.[name]; 

有關(guān)目標(biāo)的詳細(xì)內(nèi)容,請(qǐng)參閱“SQL Server 擴(kuò)展事件目標(biāo)。”

數(shù)據(jù)包 數(shù)據(jù)包是一個(gè)用于定義擴(kuò)展事件對(duì)象(如事件、動(dòng)作和目標(biāo))的容器。數(shù)據(jù)包位于它所描述的模塊(如可執(zhí)行程序或 DLL)中,如圖 3 所示。

圖 3 模塊、數(shù)據(jù)包和擴(kuò)展事件對(duì)象之間的關(guān)系

使用擴(kuò)展事件引擎注冊(cè)數(shù)據(jù)包時(shí),它所定義的全部對(duì)象都可供使用。有關(guān)數(shù)據(jù)包和擴(kuò)展事件術(shù)語完整列表的詳細(xì)信息,請(qǐng)參閱“SQL Server 擴(kuò)展事件數(shù)據(jù)包。”

會(huì)話 會(huì)話是一種將多個(gè)擴(kuò)展事件對(duì)象鏈接到一起進(jìn)行處理的方法 — 事件包含動(dòng)作,將被目標(biāo)所消耗。會(huì)話可鏈接任何注冊(cè)的數(shù)據(jù)包中的對(duì)象,任何數(shù)量的會(huì)話都可以使用同一個(gè)事件、動(dòng)作等。使用下列代碼可查看已定義了哪些擴(kuò)展事件會(huì)話:

  1. SELECT * FROM sys.dm_xe_sessions;  
  2. Go 
可使用 T-SQL 命令來創(chuàng)建、刪除、更改、停止和啟動(dòng)會(huì)話。可以想見,這將提供很多靈活性,甚至提供通過對(duì)會(huì)話本身所捕獲的數(shù)據(jù)進(jìn)行程序化分析來動(dòng)態(tài)更改會(huì)話的功能。有關(guān)會(huì)話的詳細(xì)內(nèi)容,請(qǐng)參閱“SQL Server 擴(kuò)展事件會(huì)話。”

性能注意事項(xiàng)

使用 CREATE EVENT SESSION 將擴(kuò)展事件會(huì)話放置在一起時(shí),需要認(rèn)真正確配置一些設(shè)置,因?yàn)樗鼈兛赡軙?huì)在無意中對(duì)性能產(chǎn)生影響。首先需要決定是以同步還是異步方式消耗事件。正如您所料,同步目標(biāo)對(duì)所監(jiān)控代碼的性能產(chǎn)生的影響要大過異步目標(biāo)。

如前所述,同步消耗某個(gè)事件時(shí),觸發(fā)該事件的代碼必須一直等待,直到該事件被消耗為止。顯然,如果事件消耗是一個(gè)復(fù)雜的過程,則這可能會(huì)降低代碼的性能。

例如,在一個(gè)每秒處理數(shù)千個(gè)小事務(wù)的繁忙系統(tǒng)中,同步消耗 sql_statement_completed 事件及捕獲查詢計(jì)劃動(dòng)作很可能會(huì)對(duì)性能產(chǎn)生負(fù)面影響。另外還要記住,謂詞始終是同步執(zhí)行的,因此應(yīng)注意不要為性能關(guān)鍵代碼觸發(fā)的事件創(chuàng)建過于復(fù)雜的謂詞。

另一方面,您可能會(huì)被強(qiáng)制同步消耗事件。要計(jì)算某個(gè)特定事件的出現(xiàn)次數(shù),最簡(jiǎn)單的方法很可能是使用 synchronous_event_counter 目標(biāo)。

您必須考慮的第二件事情是如果決定使用異步目標(biāo),那么該如何配置事件緩沖。事件緩沖的默認(rèn)可用內(nèi)存數(shù)為 4MB。事件被觸發(fā),隨后被目標(biāo)消耗,期間的默認(rèn)調(diào)度延遲為 30 秒。這意味著如果您希望每 10 秒生成一些事件統(tǒng)計(jì)數(shù)據(jù),則必須對(duì)延遲時(shí)間進(jìn)行調(diào)整。

對(duì)用于緩沖事件的內(nèi)存進(jìn)行分區(qū)的方法是將其綁定到事件緩沖設(shè)置。默認(rèn)情況下是為整個(gè)實(shí)例創(chuàng)建一組緩沖區(qū)。在 SMP(對(duì)稱多處理器)和 NUMA(非統(tǒng)一內(nèi)存訪問)計(jì)算機(jī)中,這可能會(huì)使處理器不得不等待訪問內(nèi)存,從而導(dǎo)致出現(xiàn)性能問題。

第三個(gè)注意事項(xiàng)是如何處理事件丟失。在定義擴(kuò)展事件會(huì)話時(shí),可指定事件是否可以“丟失”。這意味著如果沒有足夠的內(nèi)存來緩沖某個(gè)事件,則可將其直接丟棄。默認(rèn)設(shè)置是允許丟棄單個(gè)事件,但也可以允許整個(gè)事件緩沖區(qū)都丟失(適用于事件緩沖區(qū)很快就被填滿的會(huì)話),甚至還可以指定任何事件都不得丟失。

使用***一個(gè)選項(xiàng)時(shí)應(yīng)格外注意,因?yàn)樗鼤?huì)強(qiáng)制觸發(fā)事件的代碼一直等待,直到有足夠的緩沖區(qū)內(nèi)存來存儲(chǔ)該事件為止。設(shè)置此選項(xiàng)幾乎肯定會(huì)對(duì)性能產(chǎn)生不利影響。請(qǐng)注意,如果無意間啟用了此選項(xiàng),服務(wù)器仍會(huì)擁有足夠的響應(yīng)能力讓您能夠禁用此設(shè)置。

通常,您需要通盤考慮這些選項(xiàng)。實(shí)際上我并沒有辦法為您提供通用的***方法,我能做的只是向您強(qiáng)調(diào)深入領(lǐng)會(huì)它們,否則您可能會(huì)遇到性能問題。有關(guān)這些設(shè)置的詳細(xì)信息,請(qǐng)參閱“CREATE EVENT SESSION (T-SQL)”。

事件的壽命

定義并啟動(dòng)擴(kuò)展事件會(huì)話后,處理過程將照常進(jìn)行,直到所監(jiān)控的代碼遇到某個(gè)事件為止。圖 4 介紹了擴(kuò)展事件系統(tǒng)所遵循的步驟。具體步驟如下:

執(zhí)行檢查以查看是否有任何擴(kuò)展事件會(huì)話正在監(jiān)控該事件。如果沒有,控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。

確定事件的負(fù)載,將所需的全部信息都收集到內(nèi)存中 — 換言之,構(gòu)建事件的負(fù)載。

如果為該事件定義了任何謂詞,則執(zhí)行它們。此時(shí),謂詞結(jié)果可能是不應(yīng)消耗該事件。如果是這種情況,控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。

此時(shí)系統(tǒng)已得知事件將被消耗,因此將執(zhí)行鏈接到該事件的所有動(dòng)作?,F(xiàn)在事件已具有完整的負(fù)載,已為消耗做好準(zhǔn)備。

將事件提供給同步目標(biāo)(如果有的話)。

如果存在任何異步目標(biāo),將會(huì)緩沖該事件以便隨后進(jìn)行處理。

控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。

圖 4“擴(kuò)展事件”事件的壽命(單擊圖像可查看大圖)

如前所述,在創(chuàng)建事件會(huì)話時(shí)應(yīng)格外注意,要避免同步動(dòng)作或異步目標(biāo)的緩沖對(duì)所監(jiān)控代碼的性能產(chǎn)生影響。

使用擴(kuò)展事件

SQL Server 2008 聯(lián)機(jī)叢書中包括兩個(gè)擴(kuò)展事件的使用示例:“如何:確定哪些查詢持有鎖”和“如何:查找具有最多鎖定的對(duì)象。”

我將通過一個(gè)對(duì)擴(kuò)展事件會(huì)話進(jìn)行設(shè)置和對(duì)結(jié)果進(jìn)行分析的示例對(duì)此加以講解。當(dāng)我在 2007 年年末使用擴(kuò)展事件時(shí),我發(fā)現(xiàn)把簡(jiǎn)單的會(huì)話組裝起來非常容易(直接使用 T-SQL DDL 語句即可),但對(duì)結(jié)果進(jìn)行分析卻比較麻煩。

這些結(jié)果均以 XML 形式表示,最初這令我很吃驚,但隨后我意識(shí)到面對(duì)可能被收集到單個(gè)會(huì)話中的大量可能的事件和動(dòng)作的組合,要想存儲(chǔ)此類可擴(kuò)展架構(gòu),可能再也沒有比這更可行的選擇了。

現(xiàn)在,我已在 SQL Server 存儲(chǔ)引擎團(tuán)隊(duì)擔(dān)任開發(fā)人員多年,雖然我自認(rèn)為已經(jīng)相當(dāng)精通 C、C++ 和匯編編程程序,但從 XML 數(shù)據(jù)中通過編程方式找出提取事件負(fù)載字段所需的代碼仍花了我數(shù)小時(shí)的時(shí)間。我并不是要?jiǎng)褡枘褂脭U(kuò)展事件,相反,我只是告誡您如果還不熟悉 XML 數(shù)據(jù)的使用,那么***在查看結(jié)果前對(duì)學(xué)習(xí)曲線有所準(zhǔn)備。

我的具體情況是這樣的:我是一名 DBA,使用 SQL Server 2008 的資源管理器功能在公司的其中一臺(tái)生產(chǎn)服務(wù)器上對(duì)各種組合進(jìn)行沙箱測(cè)試。我創(chuàng)建了兩個(gè)資源管理器資源池(開發(fā)部和市場(chǎng)部),用來表示使用該服務(wù)器的團(tuán)隊(duì)。利用資源管理器可以限制每個(gè)池的 CPU 和查詢執(zhí)行內(nèi)存使用情況,但不能限制它們所使用的 I/O 資源數(shù)量。因此,我想根據(jù)各個(gè)團(tuán)隊(duì)在該服務(wù)器上的 I/O 使用情況向其開具賬單,以建立一種攤銷升級(jí)到新 SAN(存儲(chǔ)區(qū)域網(wǎng)絡(luò))所花成本的退單機(jī)制。

我設(shè)想觸發(fā)捕獲 I/O 信息的***時(shí)機(jī)是在任何 T-SQL 語句完成時(shí),并且我還知道數(shù)據(jù)包 package0 中有一個(gè)名為 sql_statement_completed 的事件。那么在事件負(fù)載中都收集到了哪些數(shù)據(jù)呢?

執(zhí)行下列代碼將為我提供所有數(shù)據(jù)的列表(既包括讀取的,也包括寫入的):

  1. SELECT [nameFROM sys.dm_xe_object_columns  
  2.   WHERE [object_name] = 'sql_statement_completed';  
  3. GO 
我并不認(rèn)為這些是實(shí)際的讀取和寫入(這時(shí)數(shù)據(jù)是從磁盤讀取或向磁盤寫入,而不是僅在緩沖池的內(nèi)存中),但它們可使我了解各個(gè)團(tuán)隊(duì)使用的 I/O 資源的比例。
現(xiàn)在,我需要找出究竟是哪個(gè)團(tuán)隊(duì)執(zhí)行了哪個(gè)特定的 T-SQL 語句,因此需要有一個(gè)動(dòng)作來通知我。執(zhí)行此代碼可以為我提供事件觸發(fā)時(shí)我所能采取的所有動(dòng)作的列表,其中包括在 sqlserver 數(shù)據(jù)包中收集 session_resource_pool_id 的動(dòng)作:
  1. SELECT xp.[name], xo.*  
  2. FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp  
  3. WHERE xp.[guid] = xo.[package_guid]  
  4.    AND xo.[object_type] = 'action' 
  5. ORDER BY xp.[name]; 
我可以得到已為資源管理器定義的資源池的列表,并將其與擴(kuò)展事件會(huì)話所收集到的 ID 相關(guān)聯(lián)?,F(xiàn)在我已準(zhǔn)備好定義會(huì)話。請(qǐng)注意,在執(zhí)行此代碼時(shí),將首先檢查是否存在相同名稱的事件會(huì)話。如果發(fā)現(xiàn)具有同名的事件會(huì)話,它會(huì)將其刪除。以下是相關(guān)代碼:
  1. IF EXISTS (  
  2. SELECT * FROM sys.server_event_sessions  
  3.     WHERE name = 'MonitorIO')  
  4. DROP EVENT SESSION MonitorIO ON SERVER;  
  5. GO  
  6.  
  7. CREATE EVENT SESSION MonitorIO ON SERVER  
  8. ADD EVENT sqlserver.sql_statement_completed  
  9.   (ACTION (sqlserver.session_resource_pool_id))  
  10. ADD TARGET package0.ring_buffer;  
  11. GO 
 
然后它將創(chuàng)建一個(gè)包含單個(gè)事件 sql_statement_completed 的新會(huì)話,同時(shí)執(zhí)行 session_resource_pool_id 動(dòng)作,將所有內(nèi)容都記錄到環(huán)緩沖區(qū)中(此時(shí)我仍在原型設(shè)計(jì)階段)。(在生產(chǎn)中,我很可能會(huì)選擇使用異步文件目標(biāo)。)
要啟動(dòng)會(huì)話,需要執(zhí)行下列代碼:
  1. ALTER EVENT SESSION MonitorIO ON SERVER  
  2. STATE = START;  
  3. GO 
 

現(xiàn)在它已啟動(dòng)并開始運(yùn)行。

在模擬了市場(chǎng)部和開發(fā)部的一些活動(dòng)后,我已做好對(duì)會(huì)話結(jié)果進(jìn)行分析的準(zhǔn)備。下列代碼將從環(huán)緩沖區(qū)中提取數(shù)據(jù):

  1. SELECT CAST(xest.target_data AS XML) StatementData  
  2.   FROM sys.dm_xe_session_targets xest  
  3. JOIN sys.dm_xe_sessions xes ON 
  4.   xes.address = xest.event_session_address  
  5. WHERE xest.target_name = 'ring_buffer' 
  6.   AND xes.name = 'MonitorIO';  
  7. GO 
 
但是,它會(huì)將數(shù)據(jù)作為一個(gè)很大的 XML 值提取出來。如果需要將其進(jìn)一步分解,可使用圖 5 所示的代碼。
[[17436]]  圖 5 分解 XML 數(shù)據(jù)
  1. SELECT 
  2.   Data2.Results.value ('(data/.)[6]''bigint'AS Reads,  
  3.   Data2.Results.value ('(data/.)[7]''bigint'AS Writes,  
  4.   Data2.Results.value ('(action/.)[1]''int'AS ResourcePoolID  
  5. FROM 
  6. (SELECT CAST(xest.target_data AS XML) StatementData  
  7.   FROM sys.dm_xe_session_targets xest  
  8.   JOIN sys.dm_xe_sessions xes ON 
  9.     xes.address = xest.event_session_address  
  10.   WHERE xest.target_name = 'ring_buffer' 
  11.     AND xes.name = 'MonitorIO') Statements  
  12. CROSS APPLY StatementData.nodes ('//RingBufferTarget/event'AS Data2 (Results);  
  13. GO 
這種做法效果不錯(cuò),但會(huì)為捕獲的每個(gè)事件都生成一行輸出。這并不是一種可怕的格式,另外我還希望得到匯總輸出,因此我決定使用派生表,如圖 6 所示。
[[17436]]  圖 6 獲取聚合輸出
 
 
  1. SELECT DT.ResourcePoolID,  
  2.   SUM (DT.Reads) as TotalReads,  
  3.   SUM (DT.Writes) AS TotalWrites  
  4. FROM 
  5. (SELECT   
  6.   Data2.Results.value ('(data/.)[6]''bigint'AS Reads,  
  7.   Data2.Results.value ('(data/.)[7]''bigint'AS Writes,  
  8.   Data2.Results.value ('(action/.)[1]''int'AS ResourcePoolID  
  9. FROM 
  10. (SELECT CAST(xest.target_data AS XML) StatementData  
  11.   FROM sys.dm_xe_session_targets xest  
  12.   JOIN sys.dm_xe_sessions xes ON 
  13.     xes.address = xest.event_session_address  
  14.   WHERE xest.target_name = 'ring_buffer' 
  15.     AND xes.name = 'MonitorIO') Statements  
  16. CROSS APPLY StatementData.nodes ('//RingBufferTarget/event'AS Data2 (Results)) AS DT  
  17. WHERE DT.ResourcePoolID > 255 –- only show user-defined resource pools  
  18. GROUP BY DT.ResourcePoolID;  
  19. GO 
 
大功告成!其中肯定包含一些復(fù)雜的代碼,但它們都運(yùn)行正常。至此我已得到了我所需的結(jié)果??匆幌掠嘘P(guān)我的測(cè)試數(shù)據(jù)的本次查詢輸出,如圖 7 所示。

圖 7 輸出的查詢結(jié)果
ResourcePoolID TotalReads TotalWrites
256 3831 244
257 5708155 1818

 

我知道資源池 256 用于市場(chǎng)部,而 257 用于開發(fā)部,因此這些數(shù)字對(duì)于我弄清這些團(tuán)隊(duì)在公司中的數(shù)據(jù)庫使用情況很有意義。如果不使用擴(kuò)展事件,我可能無法輕松得出這些結(jié)果。
***,我將使用下列代碼來停止此會(huì)話:
 
 
  1. ALTER EVENT SESSION MonitorIO ON SERVER  
  2. STATE = STOP;  
  3. GO 
 
要了解此示例中各階段輸出的詳細(xì)內(nèi)容,請(qǐng)查看本文隨附的屏幕演示。其地址為:technetmagazine.com/video。


 

system_health 擴(kuò)展事件會(huì)話

實(shí)際上 SQL Server 2008 還提供了一個(gè)名為 system_health 的預(yù)定義會(huì)話,它被設(shè)置為默認(rèn)運(yùn)行。此會(huì)話源自產(chǎn)品支持團(tuán)隊(duì)的想法,它可以跟蹤通常被用來對(duì)客戶系統(tǒng)進(jìn)行調(diào)試的信息(例如當(dāng)客戶系統(tǒng)發(fā)生死鎖或出現(xiàn)其它嚴(yán)重錯(cuò)誤時(shí))。此會(huì)話的創(chuàng)建和啟動(dòng)是 SQL Server 2008 實(shí)例安裝過程的一部分,它在環(huán)緩沖區(qū)中跟蹤事件,因此不會(huì)消耗太多內(nèi)存。

您可以使用下列代碼來查看環(huán)緩沖區(qū)中包含的內(nèi)容:
 
 
  1. SELECT CAST (xest.target_data AS XML)  
  2. FROM sys.dm_xe_session_targets xest   
  3. JOIN sys.dm_xe_sessions xes ON 
  4. xes.address = xest.event_session_address   
  5. WHERE xes.name = 'system_health';  
  6. GO 

Microsoft PSS SQL 支持博客中包含很多有關(guān)此會(huì)話跟蹤內(nèi)容的詳細(xì)信息。

結(jié)束語

有人告訴我 SQL Server 團(tuán)隊(duì)計(jì)劃未來向 sqlserver.exe 中添加更多事件。事實(shí)上,其數(shù)量已從 2007 年二月 CTP(社區(qū)技術(shù)預(yù)覽版)中的 165 猛增到 RTM(批量生產(chǎn)版)中的 254。

此外還有許多的確非常有趣的事件,如用于更改數(shù)據(jù)捕獲的事件(我已在 2008 年 11 月《TechNet 雜志》中的“跟蹤企業(yè)數(shù)據(jù)庫中的更改”中對(duì)其做過介紹)、數(shù)據(jù)壓縮事件以及索引頁分割事件等。索引頁分割看起來有望找出那些導(dǎo)致性能降低碎片的索引,而無需在全部索引中定期運(yùn)行 sys.dm_db_index_physical_stats DMV。

原文地址

本文來源:微軟TechNet中文站

責(zé)任編輯:彭凡 來源: 微軟TechNet中文網(wǎng)
相關(guān)推薦

2010-12-16 09:05:50

SQL Server

2009-04-16 17:55:15

擴(kuò)展熱插拔SQL Server

2009-04-16 17:44:46

性能優(yōu)化擴(kuò)展高性能

2010-12-20 18:23:54

Hyper-V Ser

2012-05-16 11:35:16

SQL Server拒絕訪問

2009-04-16 17:24:54

性能優(yōu)化SQL Server 數(shù)據(jù)收集

2009-04-16 13:57:28

SQL Server 全面分析擴(kuò)展解決方案

2022-12-29 07:33:44

Strace故障排除

2009-04-16 16:54:53

集成IntegrationSSIS

2009-04-16 17:14:52

2011-04-11 12:55:34

SQL Server 平面文件

2012-07-10 09:50:55

SQL Server

2011-07-25 14:04:53

組策略

2011-09-06 10:26:23

SQL Azure故障

2024-04-26 06:43:19

KubernetesPod識(shí)別

2009-02-25 11:42:43

FILESTREAM文件流文件管理

2011-08-24 16:25:08

SQL Server 故障轉(zhuǎn)移群集

2009-01-18 16:17:00

2011-08-01 10:09:57

SSAS數(shù)據(jù)庫

2011-08-10 11:02:14

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)