擴充事件概觀

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

擴充事件 (XEvents) 架構可讓使用者收集必要的資料 (無論其多寡),來對 SQL Server、Azure SQL 資料庫、Azure SQL 受控執行個體進行監視、識別或疑難排解效能問題。 擴充事件設定性高、輕量且能夠妥善地進行擴展。 如需詳細資訊,請參閱擴充事件架構

擴充事件會取代 SQL 追蹤與 SQL Server Profiler 功能。

若要開始使用擴充事件,請使用快速入門:擴充事件

注意

如果您使用 Azure SQL,請了解 Azure SQL 資料庫和 SQL 受控執行個體的程式碼範例如何不同,以及進一步了解 Azure SQL 資料庫中的擴充事件

擴充事件的優勢

擴充事件是輕量型效能監視系統,其使用最少的系統資源,同時提供資料庫引擎的詳細深入檢視。 SQL Server Management Studio 提供擴充事件的圖形化使用者介面,可用於建立、修改和卸除事件工作階段,以及顯示和分析工作階段資料。 若要進一步了解 Management Studio 中的擴充事件支援,請參閱:

擴充事件概念

擴充事件是以 Windows 事件追蹤現有概念 (例如,事件事件取用者) 為建置基礎,並引進執行述詞等新的概念。

下表提供文件參考,以了解擴充事件中的概念。

文章 描述
擴充事件套件 描述包含物件的「擴充事件」套件。 當「擴充事件」工作階段在執行時,系統會使用這些物件來取得和處理資料。
擴充事件的目標 描述事件工作階段期間可以接收資料的事件取用者。
擴充事件引擎 描述可實作和管理擴充事件工作階段的引擎。
擴充事件工作階段 描述擴充事件工作階段。

擴充事件架構

「擴充事件」是對用於伺服器系統的一般事件處理系統的稱呼。 擴充事件基礎結構可支援資料庫引擎中資料的相互關聯,而在某些條件下,則可支援作業系統和資料庫應用程式中資料的相互關聯。 在作業系統案例中,「擴充事件」輸出必須導向 Windows 事件追蹤 (ETW)。 ETW 可將事件資料與作業系統或應用程式事件資料相互關聯。

所有應用程式都有執行點,這些執行點在應用程式內部和外部都很實用。 在應用程式內,可以使用工作最初執行期間所收集的資訊將非同步處理加入佇列。 在應用程式外,執行點會提供資訊給監視公用程式。 該資訊是關於受監視應用程式的行為和效能特性。

擴充的事件可支援在處理序外使用事件資料。 這項資料通常會由使用者用來執行效能監視,以管理或支援產品,或由使用者用來開發產品上的應用程式,以進行偵錯。 資料會使用 SQL Server Management Studio、XEvent 分析工具、效能監視器,以及 T-SQL 或 Windows 命令列工具等工具來取用或分析。

「擴充事件」具有下列重要的設計層面:

  • 「擴充事件」引擎無法得知事件。 此引擎可將任何事件繫結至任何目標,因為此引擎不受到事件內容限制。 如需有關擴充的事件引擎的詳細資訊,請參閱擴充事件引擎
  • 事件會與事件取用者區隔,後者在擴充的事件中稱為 「目標」 。 這表示,任何目標都可以接收任何事件。 此外,目標可以自動耗用任何引發的事件,這樣可以記錄或提供其他事件內容。 如需詳細資訊,請參閱擴充事件的目標
  • 事件與事件發生時所要採取的動作不同。 因此,任何動作都可以與任何事件產生關聯。
  • 述詞可以動態篩選何時應該擷取事件資料。 動態篩選會增加「擴充事件」基礎結構的彈性。 如需詳細資訊,請參閱擴充事件套件

擴充事件可同步產生事件資料 (以及非同步處理該資料),這樣可為事件處理提供彈性的方案。 此外,擴充的事件還提供下列功能:

  • 在伺服器系統上處理事件的統一方式,同時也可讓使用者隔離特定的事件來進行疑難排解。
  • 與現有的 ETW 工具整合並支援這些工具。
  • 使用 Transact-SQL 完整設定的事件處理機制。
  • 能夠動態監視使用中處理序,同時對這些處理序有最少的影響。
  • 執行的預設系統健康工作階段,而不會有任何顯著的效能影響。 此工作階段會收集系統資料,讓您能夠用來協助排除效能問題。 如需詳細資訊,請參閱使用 system_health 工作階段

擴充事件工作

使用 Management Studio 或 Transact-SQL 執行 Transact-SQL 資料定義語言 (DDL) 陳述式、取用動態管理檢視和函數或目錄檢視時,您可以針對您的 SQL Server 環境建立簡單或複雜 SQL Server 擴充事件疑難排解方案。

工作描述 發行項
使用 [物件總管] 管理事件工作階段。 在物件總管中管理事件工作階段
描述如何建立擴充事件工作階段。 擴充事件工作階段
描述如何檢視及重新整理目標資料。 SQL Server Management Studio 中的事件篩選條件
描述如何使用擴充事件工具來建立和管理擴充事件工作階段。 擴充事件工具
描述如何改變擴充事件工作階段。 更改擴充事件工作階段
描述如何取得與事件有關之欄位的資訊。 取得所有事件的欄位
描述如何在註冊的封裝中查明哪些事件可用。 SQL Server 擴充事件系統檢視表中的 SELECT 和 JOIN
描述如何判斷哪些擴充事件目標可在註冊的封裝中使用。 擴充事件的目標
描述如何檢視同等於每一個 SQL 追蹤事件及其關聯資料行的「擴充事件」事件和動作。 檢視同等於 SQL 追蹤事件類別的擴充事件
描述如何在 ADD TARGETCREATE EVENT SESSION 陳述式中使用 ALTER EVENT SESSION 子句時尋找您可設定的參數。 擴充事件的目標
描述如何將現有的 SQL 追蹤指令碼轉換為擴充事件工作階段。 將現有的 SQL 追蹤指令碼轉換為擴充事件工作階段
描述如何判斷哪些查詢持有鎖定、查詢的計畫,以及取得鎖定時的 Transact-SQL 堆疊。 判斷哪些查詢持有鎖定
描述如何識別鎖定的來源。 尋找持有最多鎖定的物件
描述如何搭配 Windows 事件追蹤來使用擴充事件,以監視系統活動。 使用擴充事件監視系統活動
使用擴充事件的目錄檢視和動態管理檢視 (DMV) SQL Server 擴充事件系統檢視表中的 SELECT 和 JOIN

使用下列 T-SQL 查詢來傳回所有可能的事件及其描述:

SELECT obj1.name AS [XEvent-name],
    col2.name AS [XEvent-column],
    obj1.description AS [Descr-name],
    col2.description AS [Descr-column]
FROM sys.dm_xe_objects AS obj1
INNER JOIN sys.dm_xe_object_columns AS col2
    ON col2.object_name = obj1.name
ORDER BY obj1.name,
    col2.name

Azure SQL 資料庫與 SQL 受控執行個體的程式碼範例可能會有所不同

某些針對 SQL Server 所撰寫的 Transact-SQL 程式碼範例,需要進行小幅變更才能在 Azure 中執行。 這類程式碼範例的其中一個類別涉及目錄檢視,其名稱前置詞視乎資料庫引擎類型而有所差異:

  • server_ - 適用於 SQL Server 和 Azure SQL 受控執行個體的前置詞
  • database_ - 適用於 Azure SQL 資料庫和 SQL 受控執行個體的前置詞

Azure SQL 資料庫僅支援資料庫範圍的事件工作階段。 SQL Server Management Studio (SSMS) 完全支援適用於 Azure SQL 資料庫的資料庫範圍的事件工作階段:包含資料庫範圍工作階段的擴充事件節點會出現在物件總管中的每個資料庫底下。

Azure SQL 受控執行個體同時支援資料庫範圍工作階段與伺服器範圍工作階段。 SSMS 完全支援適用於 SQL 受控執行個體的伺服器範圍工作階段:包含所有伺服器範圍工作階段的擴充事件節點會出現在物件總管中每個受控執行個體的 [Management] 資料夾底下。

注意

建議針對受控執行個體使用伺服器範圍工作階段。 SSMS 中的物件總管並不會針對 Azure SQL 受控執行個體顯示資料庫範圍工作階段。 使用受控執行個體時,只能使用 Transact-SQL 來查詢及管理資料庫範圍工作階段。

為了示範,下表列出並比較兩個目錄檢視子集。 為求簡潔,這些子集限制為同時包含字串 _event 的檢視名稱。 由於子集支援兩種不同的資料庫引擎類型,因此具有不同的名稱前置詞。

SQL Server 和 Azure SQL 受控執行個體中的名稱 Azure SQL 資料庫和 Azure SQL 受控執行個體中的名稱
server_event_notifications
server_event_session_actions
server_event_session_events
server_event_session_fields
server_event_session_targets
server_event_sessions
server_events
server_trigger_events
database_event_session_actions
database_event_session_events
database_event_session_fields
database_event_session_targets
database_event_sessions

上表中兩個清單截至 2022 年 3 月為止是準確的。 如需最新清單,請執行下列 Transact-SQL SELECT 陳述式:

SELECT name
    FROM sys.all_objects
    WHERE
        (name LIKE 'database[_]%' OR
         name LIKE 'server[_]%' )
        AND name LIKE '%[_]event%'
        AND type = 'V'
        AND SCHEMA_NAME(schema_id) = 'sys'
    ORDER BY name;