SQL Server 2008使用擴(kuò)展事件進(jìn)行高級(jí)故障排除
全世界的 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é)果
- SELECT
- OBJECT_NAME (ips.[object_id]) AS 'Object Name',
- si.name AS 'Index Name',
- ROUND (ips.avg_fragmentation_in_percent, 2) AS 'Fragmentation',
- ips.page_count AS 'Pages',
- ROUND (ips.avg_page_space_used_in_percent, 2) AS 'Page Density'
- FROM sys.dm_db_index_physical_stats (
- DB_ID ('SQLskillsDB'), NULL, NULL, NULL, 'DETAILED') ips
- CROSS APPLY sys.indexes si
- WHERE
- si.object_id = ips.object_id
- AND si.index_id = ips.index_id
- AND ips.index_level = 0 -- only the leaf level
- AND ips.avg_fragmentation_in_percent > 10; -- filter on fragmentation
- 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ì)增加。
使用下列代碼可以查看這些定義事件的列表: 、
- SELECT xp.[name], xo.*
- FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
- WHERE xp.[guid] = xo.[package_guid]
- AND xo.[object_type] = 'event'
- ORDER BY xp.[name];
使用下列代碼可以查找某個(gè)特定事件的負(fù)載:
- SELECT * FROM sys.dm_xe_object_columns
- WHERE [object_name] = 'sql_statement_completed';
- GO
謂詞 謂詞是指在事件消耗前利用一組邏輯規(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)作的列表:
- SELECT xp.[name], xo.*
- FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
- WHERE xp.[guid] = xo.[package_guid]
- AND xo.[object_type] = 'action'
- 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)的列表:
- SELECT xp.[name], xo.*
- FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
- WHERE xp.[guid] = xo.[package_guid]
- AND xo.[object_type] = 'target'
- 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ì)話:
- SELECT * FROM sys.dm_xe_sessions;
- Go
性能注意事項(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)行處理。
.gif)
如前所述,在創(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ù)的列表(既包括讀取的,也包括寫入的):
- SELECT [name] FROM sys.dm_xe_object_columns
- WHERE [object_name] = 'sql_statement_completed';
- GO
- SELECT xp.[name], xo.*
- FROM sys.dm_xe_objects xo, sys.dm_xe_packages xp
- WHERE xp.[guid] = xo.[package_guid]
- AND xo.[object_type] = 'action'
- ORDER BY xp.[name];
- IF EXISTS (
- SELECT * FROM sys.server_event_sessions
- WHERE name = 'MonitorIO')
- DROP EVENT SESSION MonitorIO ON SERVER;
- GO
- CREATE EVENT SESSION MonitorIO ON SERVER
- ADD EVENT sqlserver.sql_statement_completed
- (ACTION (sqlserver.session_resource_pool_id))
- ADD TARGET package0.ring_buffer;
- GO
- ALTER EVENT SESSION MonitorIO ON SERVER
- STATE = START;
- GO
現(xiàn)在它已啟動(dòng)并開始運(yùn)行。
在模擬了市場(chǎng)部和開發(fā)部的一些活動(dòng)后,我已做好對(duì)會(huì)話結(jié)果進(jìn)行分析的準(zhǔn)備。下列代碼將從環(huán)緩沖區(qū)中提取數(shù)據(jù):
- SELECT CAST(xest.target_data AS XML) StatementData
- FROM sys.dm_xe_session_targets xest
- JOIN sys.dm_xe_sessions xes ON
- xes.address = xest.event_session_address
- WHERE xest.target_name = 'ring_buffer'
- AND xes.name = 'MonitorIO';
- GO
- SELECT
- Data2.Results.value ('(data/.)[6]', 'bigint') AS Reads,
- Data2.Results.value ('(data/.)[7]', 'bigint') AS Writes,
- Data2.Results.value ('(action/.)[1]', 'int') AS ResourcePoolID
- FROM
- (SELECT CAST(xest.target_data AS XML) StatementData
- FROM sys.dm_xe_session_targets xest
- JOIN sys.dm_xe_sessions xes ON
- xes.address = xest.event_session_address
- WHERE xest.target_name = 'ring_buffer'
- AND xes.name = 'MonitorIO') Statements
- CROSS APPLY StatementData.nodes ('//RingBufferTarget/event') AS Data2 (Results);
- GO
- SELECT DT.ResourcePoolID,
- SUM (DT.Reads) as TotalReads,
- SUM (DT.Writes) AS TotalWrites
- FROM
- (SELECT
- Data2.Results.value ('(data/.)[6]', 'bigint') AS Reads,
- Data2.Results.value ('(data/.)[7]', 'bigint') AS Writes,
- Data2.Results.value ('(action/.)[1]', 'int') AS ResourcePoolID
- FROM
- (SELECT CAST(xest.target_data AS XML) StatementData
- FROM sys.dm_xe_session_targets xest
- JOIN sys.dm_xe_sessions xes ON
- xes.address = xest.event_session_address
- WHERE xest.target_name = 'ring_buffer'
- AND xes.name = 'MonitorIO') Statements
- CROSS APPLY StatementData.nodes ('//RingBufferTarget/event') AS Data2 (Results)) AS DT
- WHERE DT.ResourcePoolID > 255 –- only show user-defined resource pools
- GROUP BY DT.ResourcePoolID;
- GO
圖 7 輸出的查詢結(jié)果 |
ResourcePoolID | TotalReads | TotalWrites |
256 | 3831 | 244 |
257 | 5708155 | 1818 |
- ALTER EVENT SESSION MonitorIO ON SERVER
- STATE = STOP;
- GO
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)存。
- SELECT CAST (xest.target_data AS XML)
- FROM sys.dm_xe_session_targets xest
- JOIN sys.dm_xe_sessions xes ON
- xes.address = xest.event_session_address
- WHERE xes.name = 'system_health';
- 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中文站







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

速覽