在記憶體中,建立含 ring_buffer 目標的事件工作階段
適用於:Azure SQL Database Azure SQL 受控執行個體
本逐步解說中的高階步驟如下:
- 使用
ring_buffer
目標建立和啟動事件工作階段 - 以 XML 檢視擷取的事件資料
- 以關聯式資料列集檢視擷取的事件資料
使用 ring_buffer
目標時,步驟比 event_file
目標更簡單,因為您不需要將事件資料儲存在 Azure 儲存體中。
使用 ring_buffer 目標建立和啟動事件工作階段
若要在 SQL Server Management Studio (SSMS) 中建立新的事件工作階段,請展開 [擴充事件] 節點。 此節點位於 Azure SQL 資料庫的資料庫資料夾下,以及 Azure SQL 受控執行個體中的 [管理] 資料夾下。 以滑鼠右鍵按一下 [工作階段] 資料夾,然後選取 [新增工作階段...]。在 [一般] 頁面上,輸入工作階段的名稱,在此範例中為 example-session
。 在 [事件] 頁面上,選取要新增至工作階段的一個或多個事件。 在此範例中,我們選取了 sql_batch_starting
事件。
在 [資料儲存體] 頁面上,選取 ring_buffer
作為目標型別。 若要節省記憶體,建議您將事件數目保留為少量 (預設為 1,000),並將緩衝記憶體上限設定為 1 MB 或更少。 如需詳細資訊,請參閱 ring_buffer 目標。
現在已設定工作階段,您可以選擇性選取 [指令碼] 按鈕來建立工作階段的 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;