Créer une session d'événements avec une cible ring_buffer en mémoire

S’applique à : Azure SQL DatabaseAzure SQL Managed Instance

Les étapes générales de cette procédure pas à pas sont les suivantes :

  1. Créer et démarrer une session d’événements avec une ring_buffer cible
  2. Afficher les données d’événement capturées au format XML
  3. Afficher les données d’événement capturées en tant qu’ensemble de lignes relationnelles

Avec la ring_buffer cible, les étapes sont plus simples que celles de la event_file cible, car vous n’avez pas besoin de stocker les données d’événement dans Stockage Azure.

Créer et démarrer une session d’événements avec une cible ring_buffer

Pour créer une nouvelle session d’événements dans SQL Server Management Studio (SSMS), développez le nœud Événements étendus. Ce nœud se trouve sous le dossier de base de données dans la base de données Azure SQL et sous le dossier Gestion dans Azure SQL Managed Instance. Cliquez avec le bouton droit sur le dossier Sessions, puis sélectionnez Nouvelle session.... Dans la page Général, entrez un nom pour la session, qui se trouve example-session dans cet exemple. Dans la page Événements, sélectionnez un ou plusieurs événements à ajouter à la session. Dans cet exemple, l’événement sql_batch_starting est sélectionné.

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

Dans la page Données Stockage, sélectionnez ring_buffer le type cible. Pour conserver la mémoire, nous vous recommandons de conserver le nombre d’événements à un petit nombre (1 000 par défaut) et de définir la mémoire tampon maximale sur 1 Mo ou moins. Pour plus d’informations, consultez ring_buffer cible.

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

Maintenant que la session est configurée, vous pouvez éventuellement sélectionner le bouton Script pour créer un script T-SQL de la session pour l’enregistrer ultérieurement. Voici le script de notre exemple de session :

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

Sélectionnez OK pour créer l’utilisateur.

Afficher les données de session en tant que XML

Dans l’Explorateur d’objets, développez le dossier Sessions pour voir la session d’événements que vous avez créée. Par défaut, la session n’est pas démarrée lors de sa création. Pour démarrer la session, cliquez avec le bouton droit sur le nom de la session, puis sélectionnez Démarrer la session. Vous pouvez l’arrêter ultérieurement en sélectionnant de la même façon Arrêter la session, une fois la session en cours d’exécution.

À mesure que les lots T-SQL sont exécutés dans cette base de données ou instance gérée, la session écrit des événements dans une mémoire tampon. Étant donné que la taille de la mémoire tampon est finie, une fois que toutes les mémoires sont utilisées, les anciens événements sont ignorés pour faire de la place aux événements plus récents.

Dans l’Explorateur d’objets, développez la session pour afficher la package0.ring_buffer cible, puis double-cliquez sur la cible. Vous pouvez également cliquer avec le bouton droit et sélectionner Afficher les données cibles.... Cela ouvre une grille avec un fragment XML affiché. Sélectionnez ce fragment XML pour afficher un document XML représentant le contenu de la mémoire tampon.

La première ligne du document XML décrit les métadonnées de session et de cible :

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

Dans cet exemple, nous voyons que 17 événements ont été traités par la ring_buffer cible. Aucun événement n’a été supprimé, car la mémoire tampon n’a pas été épuisée et le nombre maximal d’événements que nous avons configurés (1 000) n’a pas été atteint.

Conseil

Attention à l’attribut truncated . S’il est défini 1sur , cela signifie que la représentation XML de la mémoire tampon n’affiche pas tout le contenu de la mémoire tampon. Pour plus d’informations, consultez Ordre de génération des cibles.

Le reste du document XML contient des événements. Une représentation d’un événement unique dans XML peut ressembler à ceci :

  <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>

Ici, l’attribut value contient le lot T-SQL (une requête unique dans cet exemple).

Afficher les données de session en tant qu’ensemble de lignes relationnelles

Pour afficher les données d’événement d’une ring_buffer cible dans un ensemble de lignes relationnel, vous devez écrire une requête T-SQL qui utilise des expressions XQuery pour convertir du code XML en données relationnelles.

Voici un exemple pour la session que nous avons créée, affichant d’abord les événements les plus récents :

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;