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

例如,工作負(fù)載可能會發(fā)生變化(如并發(fā)用戶的數(shù)量、需要執(zhí)行的查詢數(shù)以及需要運行的新月末報告)、需要處理的數(shù)據(jù)量可能會增加、運行系統(tǒng)的硬件平臺可能會發(fā)生變化(如處理器內(nèi)核數(shù)量、可用的服務(wù)器內(nèi)存數(shù)量以及 I/O 子系統(tǒng)容量),另外還可能引入新的并發(fā)工作負(fù)載(如事務(wù)復(fù)制、數(shù)據(jù)庫鏡像以及更改數(shù)據(jù)捕獲)。
但這些并不是問題的全部。在設(shè)計和測試應(yīng)用程序系統(tǒng)時,設(shè)計中往往會出現(xiàn)很多意外的問題,這些也都需要進(jìn)行故障排除。顯然,無論在應(yīng)用程序生命周期的哪個階段發(fā)現(xiàn)問題,都必須通過故障排除來找出原因并給出解決方案。
在一個復(fù)雜的應(yīng)用程序系統(tǒng)中,可能會有許多需要進(jìn)行分析的硬件和軟件組件,但我關(guān)注的只是 SQL Server。拋開各種性能故障排除方法不談(這些屬于本文以外的內(nèi)容),您對 SQL Server 進(jìn)行故障排除時都需要哪些工具呢?
SQL Server 2005 中的故障排除
在最近的幾個 SQL Server 版本中,可用于性能故障排除的工具大為增加。SQL Server 包含大量的 DBCC(數(shù)據(jù)庫控制臺命令)命令,可用于深入了解數(shù)據(jù)庫引擎各個部分的當(dāng)前狀況。此外還包括 SQL Server Profiler,它可以通過編程的方式使用底層 SQL Trace 機(jī)制。
盡管 SQL Server 為進(jìn)行故障排除不斷加以改進(jìn),但這些選擇依然存在某些問題。DBCC 輸出的后處理顯得有些笨拙,因為必須先將輸出結(jié)果轉(zhuǎn)儲到一個臨時表中然后才能對其進(jìn)行操作。而且,如果配置不當(dāng),在運行 SQL Trace/Profiler 時可能會導(dǎo)致性能急劇降低(例如在某個繁忙系統(tǒng)中跟蹤所有“Lock:Acquired”(鎖定:獲得)和“Lock:Released”(鎖定:釋放)事件但卻忘記篩選該事件的 DatabaseId 和 ObjectId 列)。圖 1 中的屏幕快照顯示的是用于配置篩選器以進(jìn)行新跟蹤的對話框。
圖 1 在 SQL Server 2008 Profiler 中配置篩選器
SQL Server 2005 添加了動態(tài)管理視圖和函數(shù)(統(tǒng)稱為 DMV)幫助從數(shù)據(jù)庫引擎獲取信息。DMV 廢棄了某些 DBCC 命令、系統(tǒng)表和存儲過程,同時公開了許多新的引擎工作區(qū)域。這些 DMV 是一些功能強(qiáng)大且可以組合的命令,可用在復(fù)雜的 T-SQL 語句中以篩選 DMV 結(jié)果并進(jìn)行后處理。
例如,圖 2 中所示的代碼只返回數(shù)據(jù)庫中所有索引的葉級碎片和頁密度(均已圓整),它還包括一個碎片級篩選器。使用原來的 DBCC SHOWCONTIG 命令則很難實現(xiàn)這一點。(有關(guān) DMV 的詳細(xì)信息,請參閱“動態(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)隊也提供了許多有用的性能故障排除工具,如 SQLdiag 實用工具、SQL Server RML 實用工具、SQL Server 2005 性能儀表板報告和DMVStats。此外還有用于 SQL Server 2005 的Windows 事件跟蹤 (ETW) 提供程序,它可將 SQL Trace 事件與 Windows 其它部分中的事件集成在一起。
盡管 SQL Server 2005 在增強(qiáng) DBA 對數(shù)據(jù)庫引擎進(jìn)行故障排除的能力方面取得了長足進(jìn)步,但仍存在許多 DBA 幾乎無法有效進(jìn)行故障排除的情況。一個經(jīng)常被引用的示例就是某些查詢會使用過量的 CPU 資源,但 DMV 卻無法提供足夠的信息來確定究竟是哪些查詢導(dǎo)致了這些問題。但與 SQL Server 2005 不同,SQL Server 2008 可通過一個名為 SQL Server 擴(kuò)展事件的新功能來突破此類限制。
擴(kuò)展事件
擴(kuò)展事件系統(tǒng)的功能遠(yuǎn)遠(yuǎn)超出了 SQL Server 在以前提供的任何事件跟蹤和故障排除機(jī)制。在我看來,擴(kuò)展事件系統(tǒng)具有如下特色:
事件同步觸發(fā),但可同步或異步進(jìn)行處理。
任何目標(biāo)都可以消耗任何事件,而任何動作都可以與任何事件配對,從而能夠更深入地監(jiān)控系統(tǒng)。
“智能”謂詞允許您使用布爾邏輯來構(gòu)建復(fù)雜的規(guī)則。
可以使用 Transact-SQL 對擴(kuò)展事件會話進(jìn)行全面控制。
可以監(jiān)控性能關(guān)鍵代碼而不會對性能產(chǎn)生影響。
在深入講述之前,我先花一些時間來定義一些新術(shù)語。
事件 事件是指代碼中定義的點。此類示例包括:T-SQL 語句完成執(zhí)行時的點或結(jié)束獲取鎖定時的點。每個事件都有一個定義的負(fù)載(該事件返回的列的集合),它是使用 ETW 模型(其中每個事件都返回一個通道和關(guān)鍵字作為負(fù)載的一部分)來定義的,以便能夠與 ETW 集成。SQL Server 2008 最初提供 254 個定義的事件,預(yù)計在今后還會增加。
使用下列代碼可以查看這些定義事件的列表: 、
- 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];
使用下列代碼可以查找某個特定事件的負(fù)載:
- SELECT * FROM sys.dm_xe_object_columns
- WHERE [object_name] = 'sql_statement_completed';
- GO
請注意,擴(kuò)展事件系統(tǒng)包含一組說明性的 DMV,用來描述所有事件、目標(biāo)等。有關(guān)詳細(xì)內(nèi)容,請參閱“SQL Server 擴(kuò)展事件動態(tài)管理視圖?!?
謂詞 謂詞是指在事件消耗前利用一組邏輯規(guī)則來篩選事件的方法。謂詞可以很簡單,如檢查事件負(fù)載中的其中一個返回列是否為某個特定值(例如,通過對象 ID 來篩選“鎖定-獲得”事件)。
它們還具有一些高級功能,如統(tǒng)計會話期間某個特定事件發(fā)生的次數(shù)、僅允許事件在發(fā)生一次后消耗,或者動態(tài)更新謂詞本身以抑制包含類似數(shù)據(jù)的事件的消耗。
謂詞可以使用布爾邏輯來編寫,以使其能夠盡可能走捷徑。這使得只需執(zhí)行最少數(shù)量的同步處理即可確定是否需要消耗事件。
動作 動作是指在消耗某個事件前同步執(zhí)行的一組命令。任何動作都可以被鏈接到任何事件。它們通常會收集大量數(shù)據(jù)并追加到事件負(fù)載中(如 T-SQL 堆?;虿樵儓?zhí)行計劃)或
行某個被追加到事件負(fù)載中的計算。
由于執(zhí)行這些動作可能需要極高的代價,因此事件的動作僅在所有謂詞都計算完畢后才執(zhí)行,如果在隨后確定該事件不會被消耗,則將不會有同步執(zhí)行某個動作的點。使用下列代碼可找到預(yù)定義動作的列表:
- 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)空閑時對事件進(jìn)行處理 — 如獲取非審計事件的審計目標(biāo))。目標(biāo)可以同步(例如,觸發(fā)事件的代碼等待該事件被消耗)或異步消耗事件。
目標(biāo)的范圍從簡單的使用者(如事件文件和環(huán)緩沖區(qū))直到能夠執(zhí)行事件配對操作的復(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)容,請參閱“SQL Server 擴(kuò)展事件目標(biāo)?!?/p>
數(shù)據(jù)包 數(shù)據(jù)包是一個用于定義擴(kuò)展事件對象(如事件、動作和目標(biāo))的容器。數(shù)據(jù)包位于它所描述的模塊(如可執(zhí)行程序或 DLL)中,如圖 3 所示。
圖 3 模塊、數(shù)據(jù)包和擴(kuò)展事件對象之間的關(guān)系
使用擴(kuò)展事件引擎注冊數(shù)據(jù)包時,它所定義的全部對象都可供使用。有關(guān)數(shù)據(jù)包和擴(kuò)展事件術(shù)語完整列表的詳細(xì)信息,請參閱“SQL Server 擴(kuò)展事件數(shù)據(jù)包?!?/p>
會話 會話是一種將多個擴(kuò)展事件對象鏈接到一起進(jìn)行處理的方法 — 事件包含動作,將被目標(biāo)所消耗。會話可鏈接任何注冊的數(shù)據(jù)包中的對象,任何數(shù)量的會話都可以使用同一個事件、動作等。使用下列代碼可查看已定義了哪些擴(kuò)展事件會話:
- SELECT * FROM sys.dm_xe_sessions;
- Go
可使用 T-SQL 命令來創(chuàng)建、刪除、更改、停止和啟動會話??梢韵胍姡@將提供很多靈活性,甚至提供通過對會話本身所捕獲的數(shù)據(jù)進(jìn)行程序化分析來動態(tài)更改會話的功能。有關(guān)會話的詳細(xì)內(nèi)容,請參閱“SQL Server 擴(kuò)展事件會話?!?
性能注意事項
使用 CREATE EVENT SESSION 將擴(kuò)展事件會話放置在一起時,需要認(rèn)真正確配置一些設(shè)置,因為它們可能會在無意中對性能產(chǎn)生影響。首先需要決定是以同步還是異步方式消耗事件。正如您所料,同步目標(biāo)對所監(jiān)控代碼的性能產(chǎn)生的影響要大過異步目標(biāo)。
如前所述,同步消耗某個事件時,觸發(fā)該事件的代碼必須一直等待,直到該事件被消耗為止。顯然,如果事件消耗是一個復(fù)雜的過程,則這可能會降低代碼的性能。
例如,在一個每秒處理數(shù)千個小事務(wù)的繁忙系統(tǒng)中,同步消耗 sql_statement_completed 事件及捕獲查詢計劃動作很可能會對性能產(chǎn)生負(fù)面影響。另外還要記住,謂詞始終是同步執(zhí)行的,因此應(yīng)注意不要為性能關(guān)鍵代碼觸發(fā)的事件創(chuàng)建過于復(fù)雜的謂詞。
另一方面,您可能會被強(qiáng)制同步消耗事件。要計算某個特定事件的出現(xiàn)次數(shù),最簡單的方法很可能是使用 synchronous_event_counter 目標(biāo)。
您必須考慮的第二件事情是如果決定使用異步目標(biāo),那么該如何配置事件緩沖。事件緩沖的默認(rèn)可用內(nèi)存數(shù)為 4MB。事件被觸發(fā),隨后被目標(biāo)消耗,期間的默認(rèn)調(diào)度延遲為 30 秒。這意味著如果您希望每 10 秒生成一些事件統(tǒng)計數(shù)據(jù),則必須對延遲時間進(jìn)行調(diào)整。
對用于緩沖事件的內(nèi)存進(jìn)行分區(qū)的方法是將其綁定到事件緩沖設(shè)置。默認(rèn)情況下是為整個實例創(chuàng)建一組緩沖區(qū)。在 SMP(對稱多處理器)和 NUMA(非統(tǒng)一內(nèi)存訪問)計算機(jī)中,這可能會使處理器不得不等待訪問內(nèi)存,從而導(dǎo)致出現(xiàn)性能問題。
第三個注意事項是如何處理事件丟失。在定義擴(kuò)展事件會話時,可指定事件是否可以“丟失”。這意味著如果沒有足夠的內(nèi)存來緩沖某個事件,則可將其直接丟棄。默認(rèn)設(shè)置是允許丟棄單個事件,但也可以允許整個事件緩沖區(qū)都丟失(適用于事件緩沖區(qū)很快就被填滿的會話),甚至還可以指定任何事件都不得丟失。
使用***一個選項時應(yīng)格外注意,因為它會強(qiáng)制觸發(fā)事件的代碼一直等待,直到有足夠的緩沖區(qū)內(nèi)存來存儲該事件為止。設(shè)置此選項幾乎肯定會對性能產(chǎn)生不利影響。請注意,如果無意間啟用了此選項,服務(wù)器仍會擁有足夠的響應(yīng)能力讓您能夠禁用此設(shè)置。
通常,您需要通盤考慮這些選項。實際上我并沒有辦法為您提供通用的***方法,我能做的只是向您強(qiáng)調(diào)深入領(lǐng)會它們,否則您可能會遇到性能問題。有關(guān)這些設(shè)置的詳細(xì)信息,請參閱“CREATE EVENT SESSION (T-SQL)”。
事件的壽命
定義并啟動擴(kuò)展事件會話后,處理過程將照常進(jìn)行,直到所監(jiān)控的代碼遇到某個事件為止。圖 4 介紹了擴(kuò)展事件系統(tǒng)所遵循的步驟。具體步驟如下:
執(zhí)行檢查以查看是否有任何擴(kuò)展事件會話正在監(jiān)控該事件。如果沒有,控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。
確定事件的負(fù)載,將所需的全部信息都收集到內(nèi)存中 — 換言之,構(gòu)建事件的負(fù)載。
如果為該事件定義了任何謂詞,則執(zhí)行它們。此時,謂詞結(jié)果可能是不應(yīng)消耗該事件。如果是這種情況,控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。
此時系統(tǒng)已得知事件將被消耗,因此將執(zhí)行鏈接到該事件的所有動作?,F(xiàn)在事件已具有完整的負(fù)載,已為消耗做好準(zhǔn)備。
將事件提供給同步目標(biāo)(如果有的話)。
如果存在任何異步目標(biāo),將會緩沖該事件以便隨后進(jìn)行處理。
控制權(quán)將返給包含該事件的代碼,然后繼續(xù)進(jìn)行處理。
圖 4“擴(kuò)展事件”事件的壽命(單擊圖像可查看大圖)
如前所述,在創(chuàng)建事件會話時應(yīng)格外注意,要避免同步動作或異步目標(biāo)的緩沖對所監(jiān)控代碼的性能產(chǎn)生影響。
使用擴(kuò)展事件
SQL Server 2008 聯(lián)機(jī)叢書中包括兩個擴(kuò)展事件的使用示例:“如何:確定哪些查詢持有鎖”和“如何:查找具有最多鎖定的對象?!?/p>
我將通過一個對擴(kuò)展事件會話進(jìn)行設(shè)置和對結(jié)果進(jìn)行分析的示例對此加以講解。當(dāng)我在 2007 年年末使用擴(kuò)展事件時,我發(fā)現(xiàn)把簡單的會話組裝起來非常容易(直接使用 T-SQL DDL 語句即可),但對結(jié)果進(jìn)行分析卻比較麻煩。
這些結(jié)果均以 XML 形式表示,最初這令我很吃驚,但隨后我意識到面對可能被收集到單個會話中的大量可能的事件和動作的組合,要想存儲此類可擴(kuò)展架構(gòu),可能再也沒有比這更可行的選擇了。
現(xiàn)在,我已在 SQL Server 存儲引擎團(tuán)隊擔(dān)任開發(fā)人員多年,雖然我自認(rèn)為已經(jīng)相當(dāng)精通 C、C++ 和匯編編程程序,但從 XML 數(shù)據(jù)中通過編程方式找出提取事件負(fù)載字段所需的代碼仍花了我數(shù)小時的時間。我并不是要勸阻您使用擴(kuò)展事件,相反,我只是告誡您如果還不熟悉 XML 數(shù)據(jù)的使用,那么***在查看結(jié)果前對學(xué)習(xí)曲線有所準(zhǔn)備。
我的具體情況是這樣的:我是一名 DBA,使用 SQL Server 2008 的資源管理器功能在公司的其中一臺生產(chǎn)服務(wù)器上對各種組合進(jìn)行沙箱測試。我創(chuàng)建了兩個資源管理器資源池(開發(fā)部和市場部),用來表示使用該服務(wù)器的團(tuán)隊。利用資源管理器可以限制每個池的 CPU 和查詢執(zhí)行內(nèi)存使用情況,但不能限制它們所使用的 I/O 資源數(shù)量。因此,我想根據(jù)各個團(tuán)隊在該服務(wù)器上的 I/O 使用情況向其開具賬單,以建立一種攤銷升級到新 SAN(存儲區(qū)域網(wǎng)絡(luò))所花成本的退單機(jī)制。
我設(shè)想觸發(fā)捕獲 I/O 信息的***時機(jī)是在任何 T-SQL 語句完成時,并且我還知道數(shù)據(jù)包 package0 中有一個名為 sql_statement_completed 的事件。那么在事件負(fù)載中都收集到了哪些數(shù)據(jù)呢?
執(zhí)行下列代碼將為我提供所有數(shù)據(jù)的列表(既包括讀取的,也包括寫入的):
- SELECT [name] FROM sys.dm_xe_object_columns
- WHERE [object_name] = 'sql_statement_completed';
- GO
我并不認(rèn)為這些是實際的讀取和寫入(這時數(shù)據(jù)是從磁盤讀取或向磁盤寫入,而不是僅在緩沖池的內(nèi)存中),但它們可使我了解各個團(tuán)隊使用的 I/O 資源的比例。 現(xiàn)在,我需要找出究竟是哪個團(tuán)隊執(zhí)行了哪個特定的 T-SQL 語句,因此需要有一個動作來通知我。執(zhí)行此代碼可以為我提供事件觸發(fā)時我所能采取的所有動作的列表,其中包括在 sqlserver 數(shù)據(jù)包中收集 session_resource_pool_id 的動作:
- 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];
我可以得到已為資源管理器定義的資源池的列表,并將其與擴(kuò)展事件會話所收集到的 ID 相關(guān)聯(lián)?,F(xiàn)在我已準(zhǔn)備好定義會話。請注意,在執(zhí)行此代碼時,將首先檢查是否存在相同名稱的事件會話。如果發(fā)現(xiàn)具有同名的事件會話,它會將其刪除。以下是相關(guān)代碼:
- 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
然后它將創(chuàng)建一個包含單個事件 sql_statement_completed 的新會話,同時執(zhí)行 session_resource_pool_id 動作,將所有內(nèi)容都記錄到環(huán)緩沖區(qū)中(此時我仍在原型設(shè)計階段)。(在生產(chǎn)中,我很可能會選擇使用異步文件目標(biāo)。) 要啟動會話,需要執(zhí)行下列代碼:
- ALTER EVENT SESSION MonitorIO ON SERVER
- STATE = START;
- GO
現(xiàn)在它已啟動并開始運行。
在模擬了市場部和開發(fā)部的一些活動后,我已做好對會話結(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
但是,它會將數(shù)據(jù)作為一個很大的 XML 值提取出來。如果需要將其進(jìn)一步分解,可使用圖 5 所示的代碼。
[[17436]] 圖 5 分解 XML 數(shù)據(jù)
- 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
這種做法效果不錯,但會為捕獲的每個事件都生成一行輸出。這并不是一種可怕的格式,另外我還希望得到匯總輸出,因此我決定使用派生表,如圖 6 所示。
[[17436]] 圖 6 獲取聚合輸出
- 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
大功告成!其中肯定包含一些復(fù)雜的代碼,但它們都運行正常。至此我已得到了我所需的結(jié)果。看一下有關(guān)我的測試數(shù)據(jù)的本次查詢輸出,如圖 7 所示。
| 圖 7 輸出的查詢結(jié)果 |
| ResourcePoolID | TotalReads | TotalWrites |
| 256 | 3831 | 244 |
| 257 | 5708155 | 1818 |
我知道資源池 256 用于市場部,而 257 用于開發(fā)部,因此這些數(shù)字對于我弄清這些團(tuán)隊在公司中的數(shù)據(jù)庫使用情況很有意義。如果不使用擴(kuò)展事件,我可能無法輕松得出這些結(jié)果。 ***,我將使用下列代碼來停止此會話:
- ALTER EVENT SESSION MonitorIO ON SERVER
- STATE = STOP;
- GO
要了解此示例中各階段輸出的詳細(xì)內(nèi)容,請查看本文隨附的屏幕演示。其地址為:technetmagazine.com/video。
system_health 擴(kuò)展事件會話
實際上 SQL Server 2008 還提供了一個名為 system_health 的預(yù)定義會話,它被設(shè)置為默認(rèn)運行。此會話源自產(chǎn)品支持團(tuán)隊的想法,它可以跟蹤通常被用來對客戶系統(tǒng)進(jìn)行調(diào)試的信息(例如當(dāng)客戶系統(tǒng)發(fā)生死鎖或出現(xiàn)其它嚴(yán)重錯誤時)。此會話的創(chuàng)建和啟動是 SQL Server 2008 實例安裝過程的一部分,它在環(huán)緩沖區(qū)中跟蹤事件,因此不會消耗太多內(nèi)存。
您可以使用下列代碼來查看環(huán)緩沖區(qū)中包含的內(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)此會話跟蹤內(nèi)容的詳細(xì)信息。
結(jié)束語
有人告訴我 SQL Server 團(tuán)隊計劃未來向 sqlserver.exe 中添加更多事件。事實上,其數(shù)量已從 2007 年二月 CTP(社區(qū)技術(shù)預(yù)覽版)中的 165 猛增到 RTM(批量生產(chǎn)版)中的 254。
此外還有許多的確非常有趣的事件,如用于更改數(shù)據(jù)捕獲的事件(我已在 2008 年 11 月《TechNet 雜志》中的“跟蹤企業(yè)數(shù)據(jù)庫中的更改”中對其做過介紹)、數(shù)據(jù)壓縮事件以及索引頁分割事件等。索引頁分割看起來有望找出那些導(dǎo)致性能降低碎片的索引,而無需在全部索引中定期運行 sys.dm_db_index_physical_stats DMV。
原文地址
本文來源:微軟TechNet中文站
責(zé)任編輯:彭凡
來源: 微軟TechNet中文網(wǎng) SQL Server 2008
網(wǎng)站標(biāo)題:SQLServer2008使用擴(kuò)展事件進(jìn)行高級故障排除
鏈接地址:http://m.5511xx.com/article/ccchhjc.html


咨詢
建站咨詢
