在本篇,我經過使用新建「Session 」對話框來建立新的擴展事件會話。定義一個本身的擴展事件,動做和謂詞,而且發佈一個以收集事件數據爲目的的會話。sql
在SQLServer2008R2之後(不包括2008R2),才引入擴展事件的內置UI。2008的版本能夠經過安裝插件的形式或者使用T-sql語句來實現擴展事件。若是是2012之後的SSMS客戶端,也能夠訪問2008 的數據庫實例,可是看不到擴展事件UI。在2008版本中缺乏UI,意味着必須寫T-SQL和XQuery來挖掘事件數據。2012之後提供了UI來讀取2008版本中的目標文件,同時也能使用UI來進行事件數據分析。 數據庫
一下的實例都是以SQLServer 2012版進行,爲了使用SSMS中的擴展事件,首先在對象瀏覽器中打開Management | Extended Events,在打開Sessions ,看到當前實例的會話時間的列表。打開後你能看到內置的兩個擴展事件,AlwaysOn_health
and system_health
。windows
圖1瀏覽器
須要注意,擴展時間的優勢之一就是事件會話保存於服務器的元數據中,所以默認重啓後保存在實例中,然而追蹤定義則不是,在重啓後必需要執行一個自定義的存儲過程來從新建立追蹤。擴展事件很好的解決了這些繁瑣的配置。 服務器
首先,當咱們建好擴展事件之後能夠選擇會話—>編寫會話腳本—>Create 到—>新建查詢編輯窗口,獲得擴展時間的建立語句。這個語句是與之前咱們本身編寫的腳本略有不一樣的。session
其次,SQLServer 包含一個with腳本結尾的一些會話級別的選項。這些選項都是默認的。app
CREATE EVENT SESSION [XE_ReadsFilter_Trace] ON SERVER ADD EVENT sqlserver.rpc_completed ( ACTION ( sqlserver.client_app_name , sqlserver.database_id , sqlserver.server_instance_name , sqlserver.session_id ) WHERE ( logical_reads >= 10000 ) ), ADD EVENT sqlserver.sql_statement_completed ( ACTION ( sqlserver.client_app_name , sqlserver.database_id , sqlserver.server_instance_name , sqlserver.session_id ) WHERE ( logical_reads >= 10000 ) ) ADD TARGET package0.event_file ( SET filename = 'C:\temp\XE_ReadsFilter_Trace.xel' , max_file_size = ( 5 ) , max_rollover_files = ( 1 ) ) WITH ( MAX_MEMORY = 4096 KB , EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS , MAX_DISPATCH_LATENCY = 30 SECONDS , MAX_EVENT_SIZE = 0 KB , MEMORY_PARTITION_MODE = NONE , TRACK_CAUSALITY = OFF , STARTUP_STATE = OFF ) GO
代碼1sqlserver
咱們使用UI建立一個新的事件會話,行爲和屬性,在過程的結束,又將構建這個擴展事件的語句輸出了出來。性能
既可使用新建會話嚮導或者新建會話。可是,嚮導可選項比較少,所以不推薦使用。因此咱們重點介紹新建會話。spa
建立新的擴展事件,只須要郵件會話的文件夾,而後選擇新建會話…對話框有四個屬性頁:常規,事件,數據存儲和高級。
在常規頁,咱們能夠輸入事件名稱,而且開啓一些選項。這裏我輸入 HighReadQueries
做爲名稱,要求名稱必須惟一 。
圖2.常規頁
下一步就是加一些事件,切換到事件頁,選擇咱們選擇咱們打算追蹤的事件而且配置他們。設定合適的操做和謂詞。
爲了建立一個事件會話,必定要至少有一個事件。下面例子中,加入了兩個事件,sqlserver.sql_statement_completed
和sqlserver.rpc_completed。這裏能夠搜索到全部的事件庫,不少咱們已經忘記的。在這個分析器中總共有180個時間供你選擇,找到須要的。下面再事件庫下面的輸入框中輸入completed ,下面的對話框自動將包含這個單詞的事件篩選出來少於15個的事件。
圖3
注意類別/通道這兩個事件的列,基於關鍵字和通道的分類系統,被windows事件追蹤所使用。這裏不深刻講解了,理解就行。
雙擊要選中的兩個事件,而後它們出如今右側的列表中:而後點擊配置按鈕,添加動做和謂詞。
圖4
事件配置選項由三個tab組成,全局字段,過濾和事件字段。
事件字段標籤展現事件全部列字段,構成事件的默認收集字段,有些開銷較大的字段是可選收集與否的,以下圖的data_stream…
圖5
不一樣的事件有不一樣的默認捕捉事件數據。
下面咱們能夠在全局字段tab中爲兩個事件添加須要的操做。操做也被稱爲全局字段,由於這些字段不特指任何獨立事件,是公用的。
爲了加上操做,只須要選中選擇框。也能夠把一個操做加到多個事件上,高亮兩個事件,而後選中操做便可。這裏咱們把client_app_name
,
database_id
, server_instance_name
, 和session_id
加到這兩個事件上。
圖6
上述操做是廣泛良性的。而擴展事件也提供額一下反作用的操做。例如debug_break字段就會引發調試中斷。
設定過濾
最後,選擇過濾tab來配置任意謂詞。爲了縮短事件估計,阻止擴展事件引擎收集不必的數據,須要配置一個謂詞來過濾事件數據。謂詞配置和縮短邏輯是極其重要的。
例如,選中兩個事件,而後從下拉列表選擇logical_reads(邏輯讀),改變操做符列爲>=,而後輸入10000。在這種配置下,咱們的會話僅僅捕捉sqlstatement 或者存儲過程執行超過期10000的邏輯讀的事件。
圖7
這種選擇多個功能,加入相同的謂詞給兩個事件,限制了可利用的全局字段和倆個事件的普通字段。根據時間的選擇,不是全部的字段均可以使用。例如,加入咱們加入error_reported event事件,那麼選擇這三個事件時,邏輯讀這個謂詞就不能使用了。以下圖
圖8
在這個例子中,咱們配置相同的謂詞給兩個事件,可是咱們也能夠靈活的配置每個事件。
此刻,咱們能夠選擇OK來建立事件會話完成會話,由於知足了最低要求。定義事件會話的目標是非必要的。例如,咱們配置error_reported
事件加入create_dump_single_thread操做,不必保存抓取數據。下面咱們將介紹如何定義目標文件。
選擇數據存儲也而後目標下面選擇類型,選擇event_file。接着下面輸入文件名,選擇瀏覽輸入文件的輸出位置。路徑的最大長度是260個字符。例子中使用的是D:\temp\HighReadQueries。這裏不須要包含文件的默認擴展名.xel。擴展事件引擎會附_0_和一個整性數字(文件建立時間到1600年1月1日的秒的數字)來做爲文件結尾,保證文件名是惟一的。該文件類型提供了選項來設置最大文件的值,而且容許屢次反覆使用文件。若是沒有指定文件最大值,則文件將會增加至填滿驅動爲止。
圖9
在高級選項頁面,能看到額外的高級的會話選項。這裏咱們能夠從此討論,這裏保持默認便可。
選擇OK來完成會話,而後這個會話出如今擴展事件->會話的文件夾下,而後發現他是激活的,由於咱們在一開始咱們選擇了可選框—建立會話後當即開啓事件會話。生成T-SQL腳本,選擇腳本按鈕點擊OK或者建立完成後右鍵輸出建立腳本到查詢窗口(以前介紹了)。這裏我加上了相應的註釋,以便理解。
/*Create the session, named as specified on the General page*/ CREATE EVENT SESSION [HighReadQueries] ON SERVER /*Add and configure events, actions and predicates, as specified on the Events page*/ ADD EVENT sqlserver.rpc_completed ( ACTION ( sqlserver.client_app_name, sqlserver.database_id, sqlserver.server_instance_name, sqlserver.session_id ) WHERE ( [logical_reads] >= ( 10000 ) ) ), ADD EVENT sqlserver.sql_statement_completed ( ACTION ( sqlserver.client_app_name, sqlserver.database_id, sqlserver.server_instance_name, sqlserver.session_id ) WHERE ( [logical_reads] >= ( 10000 ) ) ) /*Add and configure a target, as specified on the Data Storage page*/ ADD TARGET package0.event_file ( SET filename = N'C:\temp\HighReadQueries' ) /* Set Session-level options, specified on the General and Advanced pages*/ WITH ( MAX_MEMORY = 4096 KB , EVENT_RETENTION_MODE = ALLOW_SINGLE_EVENT_LOSS , MAX_DISPATCH_LATENCY = 30 SECONDS , MAX_EVENT_SIZE = 0 KB , MEMORY_PARTITION_MODE = NONE , TRACK_CAUSALITY = OFF , STARTUP_STATE = ON ); GO
代碼2
與咱們以前的代碼很像。除了有會話當即開始,咱們還選擇了」捕獲實時在屏幕上監視數據「。一個新的窗口被打開來顯示被事件會話捕捉的數據,就像Profiler作的同樣。可是不一樣的時,當觀察實時數據引發系統性能問題時,監視器將會自動關閉。
完成後,咱們已經熟悉了擴展事件,好比建立基本會話,捕捉一個或者多個事件信息,收集操做的數量,使用簡單的謂詞,寫入文件等等。可視化操做大大減輕了腳本的難度,也提供了不少基礎信息的選擇,大大方便了擴展事件的開發。這塊只是開始應用,但願有大神能指點一下。