擴充事件套件

適用於:SQL ServerAzure SQL 資料庫Azure SQL 受控執行個體

套件是 SQL Server 資料庫引擎中擴充事件物件的容器。 例如,下列套件存在於支援擴充事件的任何資料庫引擎中:

  • package0 - 擴充事件系統物件。 這是預設封裝。
  • sqlserver - 與資料庫引擎相關的物件
  • sqlos - SQL 作業系統 (SQLOS) 相關的物件。

注意

稽核功能會在內部使用 SecAudit 封裝。 您無法透過擴充事件資料定義語言 (DDL) 使用此封裝中的任何物件。

封裝是以名稱、GUID 及包含此封裝的二進位模組所識別。 模組可以是可執行檔或動態連結程式庫。 如需詳細資訊,請參閱 sys.dm_xe_packages

封裝可以包含下列的任何或所有物件,本文稍後將會更詳細地討論:

  • 事件
  • Targets
  • 動作
  • 類型
  • 述詞
  • 地圖服務

不同封裝中的物件可以混合在事件工作階段中。 如需詳細資訊,請參閱擴充事件工作階段

封裝內容

下圖顯示可存在於封裝中的物件。

Diagram that shows the relationship of a module, packages, and objects.

事件

事件是程式 (例如 SQL Server) 之執行路徑中所要的監視點。 引發事件後,會夾帶到達所要之點的事實以及事件開始引發之後的狀態資訊。

事件只能用來追蹤或是觸發動作, 這些動作可以是同步或非同步。

注意

事件不會知道為了回應事件引發所可能觸發的動作。

當封裝向擴充的事件註冊之後,就無法變更此封裝內的一組事件。

所有事件都有定義其內容的版本控制結構描述, 這個結構描述是由具有定義之類型的事件資料行所組成。 特定類型的事件一定要依照此結構描述內指定的相同順序來提供其資料。 但是,事件目標不需要取用提供的所有資料。

事件分類

擴充的事件會使用類似於 Windows 事件追蹤 (ETW) 的事件分類模型。 會有兩個事件屬性用於分類,也就是通道和關鍵字。 使用這些屬性可支援將擴充的事件與 ETW 及其工具整合。

通道會識別事件的使用者。 下表將描述這些通道。

詞彙 定義
系統管理員 管理事件所針對的主要目標是使用者、管理員和支援人員。 在管理通道中找到的事件會指出問題,並列出定義完善的方案,供管理員做為採取動作之依據。 管理事件的一個範例就是應用程式無法連線。 這些事件不是會記載下來,就是有與其相關的訊息來告訴讀者該做什麼事情來修正問題。
運作 作業事件是用來分析及診斷問題或出現次數, 根據問題或發生的情況,它們可以用來觸發工具或工作。
分析 分析事件的發行量很大, 這些事件會描述程式作業,而且通常用於效能調查。
偵錯 偵錯事件主要由開發人員使用,以便診斷問題進行偵錯。

偵錯通道中的事件會傳回內部實作特定狀態資料。 事件傳回的結構描述和資料,在資料庫引擎的未來版本中可能會變更、變得無效或被移除,恕不另行通知。

關鍵字是應用程式所特有,可實現更精細的相關事件群組,如此可讓您更輕鬆地指定及擷取您想用於工作階段的事件。 您可以使用下列查詢來取得關鍵字資訊。

SELECT map_value AS Keyword
FROM sys.dm_xe_map_values
WHERE name = 'keyword_map';

Targets

目標是事件取用者。 目標會處理事件 (在引發事件的執行緒上同步處理,或是在系統提供的執行緒上非同步處理)。 擴充的事件會提供幾個目標型別,您可適當地使用這些目標來導向事件輸出。 如需詳細資訊,請參閱擴充事件的目標

您可使用 ADD TARGET 子句將目標新增至事件工作階段。

動作

動作是針對事件的程式設計形式的回應或回應序列。 動作會繫結至事件,而每個事件都可以有其獨特的動作集。

注意

預期用於特定事件的動作無法繫結至其他事件。

繫結至事件的動作會在引發此事件的執行緒上同步叫用。 動作的類型有許多種,而且功能也非常多樣。 動作可以:

  • 擷取程序傾印
  • 將狀態資訊存放在使用變數儲存體的本機環境中
  • 彙總事件資料
  • 將資料附加至事件資料

使用動作的常見範例包括:

  • 收集因執行緒引發事件而執行查詢的 SQL 文字
  • 收集查詢計劃控制代碼、查詢雜湊和查詢計劃雜湊
  • 收集導致引發事件的工作階段屬性,包括用戶端主機名稱、主體名稱、連線 ID 等。
  • 收集呼叫堆疊
  • 發生特定錯誤時擷取程序傾印

您可以使用 ACTION 子句將動作新增至事件工作階段。

述詞

述詞是一組邏輯規則,這些規則會在處理事件時加以評估。 如此可讓擴充的事件使用者選擇性地擷取以特定準則為根據的事件資料。

述詞可以在本機環境中儲存資料,本機環境可用來建立述詞,該述詞會在每隔 n 分鐘或是每當事件引發 n 次時傳回 True 一次。 這個本機環境存放區也可用來動態地更新此述詞,藉以在事件包含類似資料時抑制未來的事件引發。

述詞能夠擷取環境資訊,例如執行緒識別碼及事件特有的資料。 述詞會評估為完整布林運算式,並在發現整個運算式為 false 的第一個點支援最少運算 (Short Circuit)。

注意

如果稍早的述詞檢查失敗,可能就無法評估有副作用的述詞。

您可以使用 WHERE 子句將述詞新增至事件工作階段。

類型

在封裝中,每個擴充物件都有類型。 使用的類型如下:

  • action
  • event
  • message
  • pred_compare
  • pred_source
  • target
  • type

如需詳細資訊,請參閱 sys.dm_xe_objects

地圖服務

對應表會將內部值對應到字串,如此可讓使用者得知該值所表示的意義。 使用者不只能夠取得數值,也可以取得有意義的內部值描述。 下列查詢將示範如何取得對應值。

SELECT map_key, map_value
FROM sys.dm_xe_map_values
WHERE name = 'lock_mode';

上述的查詢會產生下列輸出:

map_key map_value
0 NL
1 SCH_S
2 SCH_M
3 S
4 U
5 X
6 IS
7 IU
8 IX
9 SIU
10 SIX
11 UIX
12 BU
13 RS_S
14 RS_U
15 RI_NL
16 RI_S
17 RI_U
18 RI_X
19 RX_S
20 RX_U
21 LAST_MODE

使用此資料表當做範例,假設您有一個名為 lock_mode 的資料行,而且它的值為 5。 此資料表指示 5 對應到 X,這表示鎖定類型為獨佔