周未看了這兩篇文章:sql
以爲在SQLSERVER2012開始,擴展事件的管理更加容易了,以前一直沒有用過擴展事件服務器
只是聽過,看了文章的介紹,以爲擴展事件跟SQLSERVER PROFILER有不少類似之處ide
你們能夠融會貫通sqlserver
以前有一篇文章:擴展事件在Denali CTP1裏的新功能性能
文章裏說在SQLSERVER2012以前,擴展事件的全部操做只能用TSQL或C#代碼來實現學習
如今SQLSERVER2012就方便多了,有了新的GUI,趨向於傻瓜了,對我來說是好事o(∩_∩)o 哈哈ui
趁機學習一下擴展事件
簡單介紹
首先打開SQLSERVER2012的SSMS,依次點擊打開管理-》擴展事件-》會話
在會話文件夾中,點擊右鍵-》能夠新建會話/新建會話嚮導
在已有的會話中,點擊右鍵-》啓動會話、新建會話、導出會話、刪除、屬性
這些菜單已經很豐富了
點擊-》新建會話嚮導 ,SQLSERVER會一步一步引導您怎麼新建一個會話
包括設置會話熟悉感、選擇模板、選擇要捕獲的事件、選擇要捕獲的全局字段、設置事件會話篩選器、指定會話數據存儲
這個嚮導我就不介紹了,咱們通常都不喜歡用傻瓜的嚮導,生怕漏了什麼東西沒有設置
其實你們看到嚮導中要設置的步驟:選擇模板、設置事件會話篩選器、選擇要捕獲的全局字段,有沒有以爲和SQLSERVER PROFILER差很少的感受
創建會話
咱們新建一個會話
彈出 新建會話 對話框
左邊有常規、事件、數據存儲、高級這些tab頁
等一下會陸續介紹
常規頁面
輸入會話名稱
在sql profiler裏面就是輸入跟蹤名稱
下面有一些選項,例如在服務器啓動時啓動事件會話,你能夠根據本身實際狀況進行勾選
你們知道開啓sql profiler會對SQLSERVER的性能形成影響
那麼,從下面的「在服務器啓動時啓動事件會話」
這裏告訴咱們兩個信息
信息一:自動化程度高了,以往咱們都是重啓服務器就須要本身手動打開sql profiler來從新跟蹤SQLSERVER的事件,如今有這個選項就方便多了
不用手動打開擴展事件
信息二:擴展事件對SQLSERVER的性能損耗不大
在園子裏的燕洋天大俠的文章大話擴展事件第一篇:概述(上)裏提到:
擴展事件的出現與設計主要是以性能爲主要的出發點
咱們可使用一個文件目標對象在相關的時間發生以後將信息寫入到文件中,這樣就很是的輕量級了,而且能夠精確到事件發生點
咱們在會話名稱裏輸入「blogtest」
會話中也提供了不少模板給咱們使用
就像sql profiler裏面
在文章擴展事件在Denali CTP3裏的新UI(一)中也說了
咱們支持與Profiler裏模板相似的概念,只要選擇一個模板,Event(包括Action和Predicate)和Target以及某些選項就自動選擇好了
可是在CTP3裏只有一個Standard模板,這個模板所選擇的事件和Profiler裏的Standard模板相對應
你也能夠把本身建立的Session做爲模板保存起來以備後用,保存模板只須要右鍵點擊某個Session而後選擇Export Session…便可
由於那篇文章出來的時候SQLSERVER2012也只是CTP3的階段,因此那時候只有一個標準模板,如今SQLSERVER2012出來了
已經多了不少模板了
導出會話就至關於導出模板了
sql profiler裏導出模板
導入會話模板
在新建會話對話框裏選擇模板的下拉列表有一個 <從文件...>
事件頁面
事件頁面是最複雜的,你首先看到它分爲左右兩部分,左邊是事件庫,全部在SQL Server裏註冊的擴展事件都列在這裏,右邊是你選擇的事件。
在選擇事件的時候,你能夠點擊名稱列表頭,進行事件名稱的首字母進行順序或者倒序排序,
類別和通道也是能夠排序的
事件的類別很是多,包括cdc功能的事務日誌掃描、死鎖監視、高度可用性和數據的安全性(High Availability and Disaster Recovery,HADR)、垃圾回收等等
事件過濾,好比我在在事件庫的輸入框裏輸入sql_,全部名字含有sql_字樣的事件都被列了出來而且高亮顯示
過濾也能夠按照事件名稱和說明、僅事件字段、所有來進行過濾
類別和通道的相似於EXCEL的列篩選
咱們選擇sql_statement_starting和sql_statement_completed事件
點擊所選事件頁面右上方的配置按鈕,頁面將會滑動
配置事件頁面
你能夠點擊「選擇」返回剛纔的事件庫頁面
你會看到閃電和漏斗圖標分別出如今了右邊配置頁面的全局字段(操做)標籤和篩選器(謂詞)標籤上
閃電表明的是該事件上有多少Global Fields(Actions)關聯
漏斗表明該事件有沒有Filter(Predicate)關聯
SQLSERVER Profiler裏每一個事件都含有EventSequence列,而在XEvent裏則被做爲Action來實現了。
Predicate能夠減小沒必要要的事件收集,好比我能夠配置sql_statement_starting事件的Predicate爲database_name=’Northwind’,
那麼發生在其餘數據庫的sql_statement_starting事件就不會被該Session所收集,Profiler能夠爲全部事件設置一個Column Filter,
而XEvent支持爲每一個Event設置各自獨立不一樣的Predicate
事件字段(Event Fields)標籤列出全部該Event的列,某些Event會把一些開銷比較大的列做爲可選的列,你能夠點擊前面的CheckBox選擇是否收集該列數據,
好比sql_statement_starting的statement列就能夠被取消選擇。
你能夠同時選擇多個事件並選擇/取消全局字段(操做)或配置篩選器(謂詞)
在這裏咱們爲sql_statement_starting和sql_statement_completed事件,在全局字段(操做)裏選擇database_name
不添加謂詞並保持事件字段爲默認值。
完成以後在閃電和漏斗列會顯示相應的動做和謂詞的數量
若是配置謂詞錯誤,在漏斗列會顯示 打叉
咱們刪除子句就能夠了
配置完畢以後,會看到sql_statement_starting(事件)和sql_statement_completed(事件)後面的閃電圖標列有一個動做與之關聯
數據存儲頁面
在這個頁面裏能夠選擇爲Session添加不一樣的目標(Target)
這裏咱們選擇event_file 目標並保持默認配置
高級頁面
高級頁面能夠設置控制會話行爲的高級選項,有一個選項須要特別注意,」最大調度滯後時間(Maximum dispatch latency)」
它描述了事件從被觸發到寫入到Target最長的等待時間,默認值是30秒,若是你使用和SQLSERVER Profiler client-side tracing
相似的Live Monitoring功能,你可能會但願把它改小,這樣事件被觸發後能夠儘快地顯示在SSMS裏,
但須要注意到的是改小它會增長SQL Server的開銷,這裏咱們把它改爲5秒
完成建立
點擊「肯定」完成事件會話的建立
blogtest 會話將會被建立成功並顯示在Object Explorer裏
在會話被建立後,你能夠在Object Explorer裏右鍵點擊該Session並選擇屬性,這將打開和建立會話相同的對話框,進行修改後點擊肯定便可。
若是你想查看怎麼用TSQL語句的方式能建立剛纔blogtest事件會話,能夠用編寫腳本的方式
1 CREATE EVENT SESSION [blogtest] ON SERVER 2 ADD EVENT sqlserver.sql_statement_completed(SET collect_statement=(1) 3 ACTION(sqlserver.database_name)), 4 ADD EVENT sqlserver.sql_statement_starting( 5 ACTION(sqlserver.database_name)) 6 ADD TARGET package0.event_file(SET filename=N'D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log\blogtest.xel') 7 WITH (MAX_MEMORY=4096 KB,EVENT_RETENTION_MODE=ALLOW_SINGLE_EVENT_LOSS,MAX_DISPATCH_LATENCY=5 SECONDS,MAX_EVENT_SIZE=0 KB,MEMORY_PARTITION_MODE=NONE,TRACK_CAUSALITY=OFF,STARTUP_STATE=OFF) 8 GO
啓動會話並監視
啓動會話
監視實時數據
當點擊「監視實時數據」按鈕,就會新建一個窗口
運行了一下,事件數量就不斷上升
咱們中止會話
可是彷佛SQLSERVER有些問題
我覺得SQLSERVER會刪除了blogtest這個會話,而後我刷新了一下會話節點,沒有刪除,彷佛SQLSERVER在這個地方有些bug
又或者是我本身操做不正確
xel文件
咱們看一下D:\Program Files\Microsoft SQL Server\MSSQL11.SQL2012\MSSQL\Log路徑下的狀況
我剛纔中止了會話,又從新啓動了會話,因此會產生兩個blogtest xel文件
這裏要注意一下,剛纔咱們在 數據存儲 頁面,默認的設置值是:勾選了啓用文件滾動更新,而且在最大文件數裏設置爲5
這裏跟SQL ERROR LOG是同樣的,當blogtest這個會話產生的xel文件的文件數達到5個,就會刪除最先的那個xel文件
而後生成一個新的xel文件
SQL ERRORLOG也是同樣是滾動更新的,這裏就再也不詳細敘述了~
system_health xel文件是安裝SQLSERVER的時候已經建立好的
system_health 擴展事件會話
此會話源自產品支持團隊的想法,它能夠跟蹤一般被用來對客戶系統進行調試的信息
(例如當客戶系統發生死鎖或出現其它嚴重錯誤時)
此會話的建立和啓動是 SQL Server 2008 實例安裝過程的一部分
它在環緩衝區中跟蹤事件,所以不會消耗太多內存.
咱們用editplus打開,發現都是二進制的,我還覺得是XML格式的
查看收集回來的xel文件
若是你想查看收集了一個晚上的xel文件,你能夠直接把xel文件拖進去SSMS就能夠了
上面那個blogtest_0_130315881898000000.xel一共收集了474個事件
不過擴展事件的文件名好像沒有什麼規律,若是別人給你一個xel文件叫你分析一下例以下圖那個,從文件名你只能知道是2013年16日收集的事件信息
咱們看一下擴展事件的結構
你們點擊加號,會看到事件會話下面會有一個包
咱們右鍵點擊查看目標數據
就會彈出一個新窗口
上面彈出的新窗口顯示了下面五個xel文件的全部事件,這樣就不用每一個文件逐個逐個地拖到SSMS裏面看了,更不用打開文件資源管理器
你們不相信的話,能夠把這五個xel文件拖到SSMS,而後相加起來,看是否是跟包的事件數目是同樣的
總結
這一篇簡單介紹了 擴展事件的建立和一些概念,下一篇會繼續講述如何用擴展事件來顯示和分析數據
將試圖找到一個workload中平均開銷最大的query
我的感受擴展事件跟SQL profiler真的很類似
SQL profiler把跟蹤到的事件寫入到trc文件
而擴展事件把事件信息寫入到xel文件
而監控實時數據至關於在SQL profiler裏開啓跟蹤,只不過一個在SQL profiler軟件裏查看跟蹤的事件,而另外一個直接在SSMS裏查看事件
我以爲擴展事件就像把SQL profiler集成到SSMS裏面同樣,固然擴展事件的機制跟SQL profiler是不同的
參考文章:
若有不對的地方,歡迎你們拍磚o(∩_∩)o