SQL 擴展事件

 

    在本篇,我經過使用新建「Session 」對話框來建立新的擴展事件會話。定義一個本身的擴展事件,動做和謂詞,而且發佈一個以收集事件數據爲目的的會話。sql

首先從UI開始

    在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_healthwindows

   

image

圖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建立一個新的事件會話,行爲和屬性,在過程的結束,又將構建這個擴展事件的語句輸出了出來。性能

在UI建立一個新的事件會話

    既可使用新建會話嚮導或者新建會話。可是,嚮導可選項比較少,所以不推薦使用。因此咱們重點介紹新建會話。spa

    建立新的擴展事件,只須要郵件會話的文件夾,而後選擇新建會話…對話框有四個屬性頁:常規,事件,數據存儲和高級。

image

常規頁

    在常規頁,咱們能夠輸入事件名稱,而且開啓一些選項。這裏我輸入 HighReadQueries 做爲名稱,要求名稱必須惟一 。image

圖2.常規頁

事件頁

  下一步就是加一些事件,切換到事件頁,選擇咱們選擇咱們打算追蹤的事件而且配置他們。設定合適的操做和謂詞。

添加事件

   爲了建立一個事件會話,必定要至少有一個事件。下面例子中,加入了兩個事件,sqlserver.sql_statement_completedsqlserver.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

高級會話選項

    在高級選項頁面,能看到額外的高級的會話選項。這裏咱們能夠從此討論,這裏保持默認便可。

事件會話DDL

    選擇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作的同樣。可是不一樣的時,當觀察實時數據引發系統性能問題時,監視器將會自動關閉。

總結

    完成後,咱們已經熟悉了擴展事件,好比建立基本會話,捕捉一個或者多個事件信息,收集操做的數量,使用簡單的謂詞,寫入文件等等。可視化操做大大減輕了腳本的難度,也提供了不少基礎信息的選擇,大大方便了擴展事件的開發。這塊只是開始應用,但願有大神能指點一下。

相關文章
相關標籤/搜索