SQL Server擴充事件(Extended Events)-- 使用擴充事件跟蹤查詢語句

來源:互聯網
上載者:User

標籤:擴充事件   xevent   extented events   

SQL Server 擴充事件(Extended Events )-- 使用擴充事件跟蹤查詢語句

 

建立擴充事件會話

展開“Object Explorer”、“Management”、“Extended Events”、“Sessions”目錄,你會發現一到兩個預設的會話。預設,在SQL Server 2012包含system_health會話,而根據不同的SQL Server2012的版本,可能有AlwaysOn_health會話。你可以在空閑時檢查這些會話,現在,我們來建立一個會話來更好的理解擴充事件是如何工作的。每個會話包含了相同的基礎組件。

 

可以通過右鍵“Sessions”的“New Session Wizard”嚮導來建立會話,也可以通過T-SQL來建立。這裡我們通過右鍵“Session”的“New Session”,在“General”頁,輸入會話的名字Check Queries。在這頁可以不必配置任何選項,如果沒有必要。在“Template”下拉式功能表的 “Query Detail Sampling”模板捕獲關於T-SQL語句、預存程序和批處理的事件數目據。你可以修改預設設定,例如添加或刪除事件,或者使用模板設定的配置項。一旦你儲存了會話,你就不能使用正在被使用的模板,但你可以按需修改屬性設定。

 

650) this.width=650;" title="clip_image001" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image001" src="http://s3.51cto.com/wyfs02/M01/58/51/wKioL1SuXs7hHUYUAAJPmXrL9E8284.jpg" border="0" height="679" />

 

“General”頁的大部分選項都是很明確的。唯一一個不太清晰的的選項是“Casualty tracking”下的“Track how events are related to one another”選項,讓你在相關任務之間跟蹤事件,當一個任務的工作被另一個做了的時候。

 

這裡,我們只輸入會話的名稱,進入到“Events”頁去選擇你想監控的事件。

 

650) this.width=650;" title="clip_image002" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image002" src="http://s3.51cto.com/wyfs02/M02/58/51/wKioL1SuXs-DRtsRAATlBz_OgJs882.jpg" border="0" height="725" />

 

如果你在“Event library”內選擇一個事件,下面會顯示它的描述資訊。以及相關的事件域的列表。我們添加query_post_execution_showplan和sql_statement_completed事件。

 

650) this.width=650;" title="clip_image003" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image003" src="http://s3.51cto.com/wyfs02/M00/58/51/wKioL1SuXtGC2pQUAAQCI2_Lytw587.jpg" border="0" height="680" />

 

直接點OK儲存。

 

右鍵點擊建立的會話,選擇“Start Session”,再次右鍵點擊該會話,選擇“Watch Live Data”。運行如下的查詢:

 

USE AdventureWorks2012GOSELECT * FROM Production.TransactionHistoryORDER BY TransactionDate DESC, ReferenceOrderID, ReferenceOrderLineID;SELECT * FROM Person.PersonWHERE BusinessEntityID <> 100OR BusinessEntityID <> 200ORDER BY PersonType, Lastname, FirstName;SELECT * FROM Sales.CurrencyORDER BY Name;

 

結果顯示如下:

 

650) this.width=650;" title="clip_image004" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image004" src="http://s3.51cto.com/wyfs02/M01/58/51/wKioL1SuXtKyvm7xAAJ-PX6dShQ749.jpg" border="0" height="490" />

 

該會話對於剛才啟動並執行每一條語句都記錄了一個sql_statement_completed事件,每個語句一個query_post_execution_showplan事件,和大量與SQL Server管理相關的query_post_execution_showplan事件。

 

對於query_post_execution_showplan事件,可以看到像duration、estimated_rows和showplan_xml。如果你雙擊showplan_xml值,該XML將會在新的視窗開啟,更具可讀性。

 

650) this.width=650;" title="clip_image005" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image005" src="http://s3.51cto.com/wyfs02/M02/58/51/wKioL1SuXtOxqy71AAI_g3k4syY622.jpg" border="0" height="501" />

 

當雙擊statement的值時,將彈出詳細的觸發該事件的語句。

 

650) this.width=650;" title="clip_image006" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image006" src="http://s3.51cto.com/wyfs02/M00/58/51/wKioL1SuXtSQrc7OAAJ7zoIvwVU512.jpg" border="0" height="544" />

 

儘管我們只添加了兩個事件到我們的會話,我們仍然收到了大量的資訊。我們需要添加過濾條件限制返回我們感興趣的事件。

 

添加過濾條件到會話

過濾條件限制了返回基於特定準則的會話的數量。在添加過濾條件到會話前,先關閉“Live Data”視窗。然後在“Object Explorer”,右鍵點擊該會話選擇“Properties”,在“Session Properties”對話方塊,進入“Events”頁點擊“Configure”按鈕。出現一個讓你選擇配置過濾條件的域的螢幕。進入到“Filter(Predicate)”視窗,在“Selected events”選擇“query_post_execution_showplan”事件。

 

我們對query_post_execution_showplan事件添加了兩個過濾條件。第一個過濾條件,針對duration域,大於(>)操作符,值為500000。該事件將返回執行時間大於500000微秒的會話。

 

另一個過濾條件,source_database_id必需等於5,在我的測試環境,AdventureWorks2012資料庫的ID為5。我添加該過濾條件,使得該會話只包含與這個資料庫相關的query_post_execution_showplan事件。

 

650) this.width=650;" title="clip_image007[4]" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image007[4]" src="http://s3.51cto.com/wyfs02/M01/58/51/wKioL1SuXtWiuRITAANc4gyNd6Q869.jpg" border="0" height="680" />

 

再針對sql_statement_completed事件,在duration域,我們添加了相同的過濾條件。

 

650) this.width=650;" title="clip_image008[4]" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image008[4]" src="http://s3.51cto.com/wyfs02/M02/58/51/wKioL1SuXteS1TrwAAL-KyLxXxs241.jpg" border="0" height="677" />

 

過濾條件配置完後,點擊“OK”關閉會話屬性對話方塊。右鍵點擊“Object Explorer”,選擇“Watch Live Data”。再次運行剛才的語句,只有一條語句返回了事件。

 

650) this.width=650;" title="clip_image009" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image009" src="http://s3.51cto.com/wyfs02/M00/58/51/wKioL1SuXtiiOwqPAAGEOxm6ido956.jpg" border="0" height="499" />

 

因為只有一條SELECT語句超過了500000微秒。所以,會話只包含一個sql_statement_completed事件和一個query_post_execution_showplan事件。

 

添加域到會話

先關掉“Live Data”視窗,再次開啟會話的屬性。進入“Events”頁點擊“Configure”。進入“Global Fields(Actions)”視窗。在全域域,像database_id和database_name域是對多個事件可用。一直以來,添加一個或多個域到事件中用來提供有用的資訊。例如,有時候可能去知道哪個query_post_execution_showplan事件與哪個sql_statement_completed事件在結果中是相關的,這比較困難。如果我們添加transaction_id域到每個事件,這就可以更好的關聯這些事件。

 

選擇“Selected events”中的query_post_execution_showplan事件,在全域域中選擇transaction_id域。

 

650) this.width=650;" title="clip_image010" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image010" src="http://s3.51cto.com/wyfs02/M01/58/51/wKioL1SuXtmzOxEaAAUxFAM_Otc324.jpg" border="0" height="680" />

 

進入“Event Fields”視窗,選擇“database_name”域。注意,有些在全域域中列出的域,也會包含在事件域中,像database_name域。

 

650) this.width=650;" title="clip_image011" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image011" src="http://s3.51cto.com/wyfs02/M01/58/54/wKiom1SuXhnidUZfAARJl2DcZC4504.jpg" border="0" height="681" />

 

不論域是在哪裡列出的,記住只要你只需要添加必要的域,因為任何你添加的組件都會增加負載。當然,我們不必添加database_name域到這個事件,因為我們的過濾條件只返回針對一個資料庫的事件。然後,在這裡包含資料庫名只是為瞭解釋可選的事件域是如何工作的。

 

現在再針對sql_statement_completed事件重複上述操作,在全域域,選擇database_name和transaction_id域。

 

650) this.width=650;" title="clip_image012" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image012" src="http://s3.51cto.com/wyfs02/M02/58/54/wKiom1SuXh2gs07lAATgp1SizIY739.jpg" border="0" height="678" />

 

現在進入sql_statement_completed事件相關的“Event Field”視窗。你可以選擇包含parameterized_plan_handle域和statement域。預設情況下,第一個沒有選擇,第二個被選擇。這裡,我們保持預設設定。點擊“OK”儲存會話關閉會話屬性對話方塊。

 

接下來,開啟“Live Data”視窗,運行上述查詢。將會看到更詳細的資訊,點擊query_post_execution_showplan事件,可以看到包含資料庫名和事務ID,在這裡是630312。

 

650) this.width=650;" title="clip_image013" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image013" src="http://s3.51cto.com/wyfs02/M00/58/54/wKiom1SuXh2RDXEbAAHS2UE1Ing654.jpg" border="0" height="395" />

 

點擊sql_statement_completed,也顯示了事務ID為630312,以及資料庫名。

 

650) this.width=650;" title="clip_image014" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image014" src="http://s3.51cto.com/wyfs02/M01/58/54/wKiom1SuXh7DcguLAAHRggOabXM263.jpg" border="0" height="425" />

 

可以看到,添加的資訊可以協助我們更好的理解資料的來源,以及這些片段之間的關係。

 

儲存會話資料

再次關閉“Live Data”視窗,開啟會話屬性,進入“Data Storage”頁,裡面可以選擇要儲存的格式。

 

SQL Server提供了多種格式來儲存會話事件:

l Etw_classic_sync_target:輸出事件以Event Tracing for Windows(ETW)格式。

l Event_counter:輸出事件到記憶體記錄會話中跟蹤事件觸發的次數。

l Event_file:輸出事件到磁碟上的一個目錄的檔案。

l Histogram:輸出事件到記憶體基於域和行動分組計數事件。

l Pair_matching:輸出事件到記憶體跟蹤基於目標配置沒有對應事件的事件。

l Ring_buffer:輸出事件到記憶體跟蹤基於目標配置的一定量的事件數目據。

 

當選擇一種資料存放區類型,將會在頁面底部有一些選項可供配置如何儲存資料。這裡,我們選擇event_file類型,配置為最大檔案為200MB,最大檔案數量為10個。點擊“OK”儲存。

 

650) this.width=650;" title="clip_image015[4]" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image015[4]" src="http://s3.51cto.com/wyfs02/M02/58/54/wKiom1SuXiLDznS5AALoBqF3CJU860.jpg" border="0" height="679" />

 

再次運行上述查詢。在SSMS中展開該會話,會看到一個該事件檔案的的參照package0.evnet_file,雙擊該節點。將會開啟一個新視窗顯示捕獲的資料,類似在“Live Data”中顯示的。

 

650) this.width=650;" title="clip_image016" style="border-top:0px;border-right:0px;border-bottom:0px;border-left:0px;" alt="clip_image016" src="http://s3.51cto.com/wyfs02/M00/58/54/wKiom1SuXiTBWirOAAPdIkYITPM417.jpg" border="0" height="503" />

 

當查看完該檔案的內容後,關閉該視窗。並右鍵選擇該會話,選擇“Stop Session”。當你想再次捕獲資料的時候,你再開啟。


本文出自 “SQL Server Deep Dives” 部落格,請務必保留此出處http://ultrasql.blog.51cto.com/9591438/1600824

SQL Server擴充事件(Extended Events)-- 使用擴充事件跟蹤查詢語句

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.