Skapa en händelsesession med ett ring_buffer mål i minnet

Gäller för:Azure SQL DatabaseAzure SQL Managed Instance

De övergripande stegen i den här genomgången är:

  1. Skapa och starta en händelsesession med ett ring_buffer mål
  2. Visa insamlade händelsedata som XML
  3. Visa insamlade händelsedata som en relationsraduppsättning

ring_buffer Med målet är stegen enklare än med event_file målet eftersom du inte behöver lagra händelsedata i Azure Storage.

Skapa och starta en händelsesession med ett ring_buffer mål

Om du vill skapa en ny händelsesession i SQL Server Management Studio (SSMS) expanderar du noden Utökade händelser . Den här noden finns under databasmappen i Azure SQL Database och under mappen Hantering i Azure SQL Managed Instance. Högerklicka på mappen Sessioner och välj Ny session.... På sidan Allmänt anger du ett namn för sessionen, som finns example-session i det här exemplet. På sidan Händelser väljer du en eller flera händelser som ska läggas till i sessionen. I det här exemplet valde vi händelsen sql_batch_starting .

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

På sidan Datalagring väljer du ring_buffer som måltyp. För att spara minne rekommenderar vi att du behåller antalet händelser till ett litet antal (1 000 som standard) och anger maximalt buffertminne till 1 MB eller mindre. Mer information finns i ring_buffer mål.

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

Nu när sessionen har konfigurerats kan du välja knappen Skript för att skapa ett T-SQL-skript för sessionen för att spara den till senare. Här är skriptet för vår exempelsession:

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

Välj OK för att skapa sessionen.

Visa sessionsdata som XML

I Object Explorer expanderar du mappen Sessioner för att se den händelsesession som du skapade. Som standard startas inte sessionen när den skapas. Starta sessionen genom att högerklicka på sessionsnamnet och välja Starta session. Du kan senare stoppa det genom att på liknande sätt välja Stoppa session när sessionen körs.

När T-SQL-batchar körs i den här databasen eller den hanterade instansen skriver sessionen händelser i en minnesbuffert. Eftersom storleken på minnesbufferten är begränsad tas de äldre händelserna bort när allt minne används för att göra plats för nyare händelser.

I Object Explorer expanderar du sessionen för att se package0.ring_buffer målet och dubbelklickar på målet. Du kan också högerklicka och välja Visa måldata.... Detta öppnar ett rutnät med ett XML-fragment som visas. Välj det här XML-fragmentet om du vill se ett XML-dokument som representerar innehållet i minnesbufferten.

Den första raden i XML-dokumentet beskriver sessions- och målmetadata:

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

I det här exemplet ser vi att 17 händelser bearbetades av ring_buffer målet. Inga händelser togs bort eftersom buffertminnet inte förbrukades och det maximala antalet händelser som vi konfigurerade (1 000) inte har nåtts.

Dricks

Var uppmärksam på attributet truncated . Om den är inställd på 1innebär det att XML-representationen av minnesbufferten inte visar hela buffertinnehållet. Mer information finns i ring_buffer mål.

Resten av XML-dokumentet innehåller händelser. En representation av en enskild händelse i XML kan se ut så här:

  <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 Här innehåller attributet T-SQL-batchen (en enda fråga i det här exemplet).

Visa sessionsdata som en relationsraduppsättning

Om du vill se händelsedata från ett ring_buffer mål i en relationsraduppsättning måste du skriva en T-SQL-fråga som använder XQuery-uttryck för att konvertera XML till relationsdata.

Här är ett exempel på sessionen som vi skapade och som visar de senaste händelserna först:

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;