Créer une session d'événements avec une cible ring_buffer en mémoire
S’applique à : Base de données SQL Azure SQL Managed Instance Base de données Azure SQL dans Fabric
Les étapes générales de cette procédure pas à pas sont les suivantes :
- Créer et démarrer une session d’événements avec une
ring_buffer
cible - Afficher les données d’événement capturées au format XML
- 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.
Cet article s’applique à la base de données SQL Fabric dans laquelle la base de données Azure SQL est mentionné.
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é.
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.
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 1
sur , 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;