在記憶體中,建立含 ring_buffer 目標的事件工作階段

適用於:Azure SQL DatabaseAzure SQL 受控執行個體

本逐步解說中的高階步驟如下:

  1. 使用 ring_buffer 目標建立和啟動事件工作階段
  2. 以 XML 檢視擷取的事件資料
  3. 以關聯式資料列集檢視擷取的事件資料

使用 ring_buffer 目標時,步驟比 event_file 目標更簡單,因為您不需要將事件資料儲存在 Azure 儲存體中。

使用 ring_buffer 目標建立和啟動事件工作階段

若要在 SQL Server Management Studio (SSMS) 中建立新的事件工作階段,請展開 [擴充事件] 節點。 此節點位於 Azure SQL 資料庫的資料庫資料夾下,以及 Azure SQL 受控執行個體中的 [管理] 資料夾下。 以滑鼠右鍵按一下 [工作階段] 資料夾,然後選取 [新增工作階段...]。在 [一般] 頁面上,輸入工作階段的名稱,在此範例中為 example-session。 在 [事件] 頁面上,選取要新增至工作階段的一個或多個事件。 在此範例中,我們選取了 sql_batch_starting 事件。

Screenshot of the New Session SSMS dialog showing the event selection page with the sql_batch_starting event selected.

在 [資料儲存體] 頁面上,選取 ring_buffer 作為目標型別。 若要節省記憶體,建議您將事件數目保留為少量 (預設為 1,000),並將緩衝記憶體上限設定為 1 MB 或更少。 如需詳細資訊,請參閱 ring_buffer 目標

Screenshot of the New Session SSMS dialog showing the data storage selection page with a ring_buffer target selected.

現在已設定工作階段,您可以選擇性選取 [指令碼] 按鈕來建立工作階段的 T-SQL 指令碼,以便稍後儲存。 以下是範例工作階段的指令碼:

CREATE EVENT SESSION [example-session] ON DATABASE
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.ring_buffer(SET max_memory=(1024))
GO

選取 [確定] 以建立工作階段。

以 XML 檢視工作階段資料

在 [物件總管] 中,展開 [工作階段] 資料夾,以查看您所建立的事件工作階段。 根據預設,工作階段不會在建立時啟動。 若要啟動工作階段,請以滑鼠右鍵按一下工作階段名稱,然後選取 [啟動工作階段]。 在工作階段執行之後,您稍後可採用類似做法,選取 [停止工作階段] 將其停止。

當 T-SQL 批次在此資料庫或受控執行個體中執行時,工作階段會在記憶體緩衝中寫入事件。 因為記憶體緩衝的大小有限,所以一旦使用所有記憶體,就會捨棄較舊的事件,以此為較新的事件騰出空間。

在 [物件總管] 中,展開工作階段,以查看 package0.ring_buffer 目標,然後按兩下目標。 您也可以滑鼠右鍵按一下並選取 [檢視目標資料...]。這會開啟顯示 XML 片段的方格。 選取此 XML 片段,以查看代表記憶體緩衝內容的 XML 文件。

XML 文件的第一行描述了工作階段和目標中繼資料:

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="17" eventCount="17" droppedCount="0" memoryUsed="32070">

在此範例中,我們看到 ring_buffer 目標已處理 17 個事件。 未卸除任何事件,因為緩衝記憶體未用盡,且未達到我們設定的事件數目上限 (1,000)。

提示

請注意 truncated 屬性。 如果設定為 1,則表示記憶體緩衝的 XML 表示法不會顯示整個緩衝內容。 如需詳細資訊,請參閱 ring_buffer 目標

XML 文件的其餘部分包含事件。 XML 中單一事件的表示法可能如下所示:

  <event name="sql_batch_starting" package="sqlserver" timestamp="2023-10-18T17:43:34.079Z">
    <data name="batch_text">
      <type name="unicode_string" package="package0"></type>
      <value><![CDATA[SELECT
'DatabaseXEStore[@Name=' + quotename(CAST(db_name() AS sysname),'''') +' and @ServerName=' + quotename(CAST(SERVERPROPERTY('servername') AS sysname),'''') + ']' AS [Urn],
CAST(db_name() AS sysname) AS [Name],
CAST(SERVERPROPERTY('servername') AS sysname) AS [ServerName],
(SELECT count(*) FROM sys.dm_xe_database_sessions) AS [RunningSessionCount]]]></value>
    </data>
  </event>

在這裡,value 屬性包含 T-SQL 批次 (此範例中的單一查詢)。

以關聯式資料列集檢視工作階段資料

若要查看關聯式資料列集中的 ring_buffer 目標的事件資料,您需要寫入 T-SQL 查詢,該查詢會使用 XQuery 運算式將 XML 轉換成關聯式資料。

以下是我們建立的工作階段範例,會先顯示最新的事件:

WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
SELECT CAST(xst.target_data AS xml) AS TargetData
FROM sys.dm_xe_database_session_targets AS xst
INNER JOIN sys.dm_xe_database_sessions AS xs
ON xst.event_session_address = xs.address
WHERE xs.name = N'example-session'
),
/* A row for each event in the buffer, represented as an XML fragment */
EventNode AS
(
SELECT CAST(NodeData.query('.') AS xml) AS EventInfo
FROM RingBuffer AS rb
CROSS APPLY rb.TargetData.nodes('/RingBufferTarget/event') AS n(NodeData)
)
/* A relational rowset formed by using the XQuery value method */
SELECT EventInfo.value('(event/@timestamp)[1]','datetimeoffset') AS timestamp,
       EventInfo.value('(event/@name)[1]','sysname') AS event_name,
       EventInfo.value('(event/data/value)[1]','nvarchar(max)') AS sql_batch_text
FROM EventNode
ORDER BY timestamp DESC;