Utilisation de SELECT et JOIN dans les vues système pour les événements étendus dans SQL Server

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

Cet article explique les deux ensembles de vues système qui concernent les événements étendus dans SQL Server et dans Azure SQL Database. L’article explique :

  • Comment joindre (JOIN) différentes vues système
  • Comment sélectionner (SELECT) des types d’informations particuliers à partir de la vue système
  • Comment les mêmes informations de session d’événements sont représentées de différentes perspectives technologiques, ce qui permet de mieux comprendre chaque perspective

La plupart des exemples sont écrits pour SQL Server, mais avec de petites modifications ils devraient s’exécuter sur SQL Database.

A. Informations fondamentales

Il existe deux ensembles de vues système pour les événements étendus :

Affichages catalogue :

  • Ces vues stockent des informations sur la définition de chaque session d’événements créée par CREATE EVENT SESSION, ou par un équivalent dans l’interface utilisateur de SSMS. Ces vues ignorent si une session a démarré.

    • Par exemple, si l’ Explorateur d’objets de SSMS montre qu’aucune session d’événements n’est définie, une instruction SELECT dans la vue sys.server_event_session_targets retourne zéro ligne.
  • Le préfixe de nom est :

    • sys.server_event_session* est le préfixe de nom sur SQL Server.
    • sys.database_event_session* est le préfixe de nom sur SQL Database.

Vues de gestion dynamiques (DMV) :

  • Elles stockent des informations sur l’ activité en cours des sessions d’événements en cours d’exécution. Ces DMV en savent peu sur la définition des sessions.

    • Même si toutes les sessions d’événements sont actuellement arrêtées, une instruction SELECT à partir de la vue sys.dm_xe_packages retournera toujours des lignes, car différents packages sont chargés dans la mémoire active au démarrage du serveur.
    • Pour la même raison, sys.dm_xe_objectssys.dm_xe_object_columns would also still return rows.
  • Le préfixe de nom pour les DMV d’événements étendus est le suivant :

    • sys.dm_xe_* est le préfixe de nom sur SQL Server.
    • sys.dm_xe_database_* est généralement le préfixe de nom sur SQL Database.

Autorisations :

Pour sélectionner (avec SELECT) à partir des vues système, l’autorisation suivante est nécessaire :

  • VIEW SERVER STATE si vous utilisez Microsoft SQL Server.
  • VIEW DATABASE STATE si vous utilisez Azure SQL Database.

B. Affichages catalogue

Cette section met en correspondance et en corrélation trois différentes perspectives technologiques sur la même session d’événements définie. La session a été définie et est visible dans l’ Explorateur d’objets de SQL Server Management Studio (SSMS.exe), mais elle n’est pas en cours d’exécution.

Chaque mois, il est préférable d’ installer la dernière mise à jour de SSMS, afin d’éviter toute erreur inattendue.

La documentation de référence sur les vues de catalogue pour les événements étendus se trouve dans les vues de catalogue d’événements étendus (Transact-SQL).

 

Voici la séquence de cette section B :

  • B.1 Perspective de l’interface utilisateur de SSMS

    • Créez la définition de la session d’événements à l’aide de l’interface utilisateur de SSMS. Des captures d’écran étape par étape sont fournies.
  • B.2 Perspective de Transact-SQL

    • Utilisez le menu contextuel de SSMS pour rétroconcevoir la session d’événements définie dans l’instruction Transact-SQL équivalente CREATE EVENT SESSION . Le code T-SQL montre une correspondance parfaite avec les choix dans les captures d’écran SSMS.
  • B.3 Perspective de SELECT JOIN UNION dans l’affichage catalogue

    • Exécutez une instruction T-SQL SELECT à partir des affichages catalogue système pour notre session d’événements. Les résultats correspondent aux spécifications de l’instruction CREATE EVENT SESSION .

 

B.1 Perspective de l’interface utilisateur de SSMS

Dans SSMS, dans l’ Explorateur d’objets, vous pouvez démarrer la boîte de dialogue Nouvelle session en développant Gestion>Événements étendus, puis en cliquant avec le bouton droit sur Sessions>Nouvelle session.

Dans la grande boîte de dialogue Nouvelle session , dans la première section intitulée Général, nous constatons que l’option Démarrer la session d’événements au démarrage du serveura été sélectionnée.

New Session > General, Start the event session at server startup.

Ensuite, dans la section Événements, nous constatons que l’événement lock_deadlock a été choisi. Pour cet événement, nous voyons que trois Actions ont été sélectionnées. Cela signifie que le bouton Configurer a été enfoncé. C’est pourquoi il est maintenant grisé.

New Session > Events, Global Fields (Actions)

Ensuite, toujours dans la section Événements>Configurer, nous constatons que resource_type a la valeur PAGE. Cela signifie que les données d’événement ne seront pas envoyées du moteur d’événements à la cible si la valeur de resource_type est autre que PAGE.

Nous constatons la présence de filtres de prédicat supplémentaires pour le nom de base de données et pour un compteur.

New Session > Events, Filter Predicate Fields (Actions)

Ensuite, dans la section Stockage de données, nous constatons qu’event_file a été choisi comme cible. En outre, nous constatons que l’option Activer la substitution de fichier a été sélectionnée.

New Session > Data Storage, eventfile_enablefileroleover

Pour finir, dans la section Avancé, nous constatons que la valeur de Latence maximale de répartition a été réduite à quatre secondes.

New Session > Advanced, Maximum dispatch latency

Cette étape termine la perspective de l’interface utilisateur de SSMS sur une définition de session d’événement.

B.2 Perspective de Transact-SQL

Quelle que soit la façon dont une définition de session d’événement est créée, à partir de l’interface utilisateur de SSMS la session peut être rétroconçue dans un script Transact-SQL correspondant parfaitement. Vous pouvez examiner les captures d’écran de Nouvelle session précédentes et comparer leurs spécifications visibles aux clauses dans le script T-SQL CREATE EVENT SESSION suivant généré.

Pour rétroconcevoir une session d’événements, dans l’ Explorateur d’objets vous pouvez cliquez avec le bouton droit sur le nœud de votre session, puis choisir Générer un script de la session en tant que>Créer dans>Presse-papiers.

Le script T-SQL suivant a été créé par rétroconception avec SSMS. Il a ensuite été amélioré manuellement par manipulation stratégique des espaces uniquement.

CREATE EVENT SESSION [event_session_test3]
	ON SERVER  -- Or, if on Azure SQL Database, ON DATABASE.

	ADD EVENT sqlserver.lock_deadlock
	(
		SET
			collect_database_name = (1)
		ACTION
		(
			package0  .collect_system_time,
			package0  .event_sequence,
			sqlserver .client_hostname
		)
		WHERE
		(
			[database_name]           = N'InMemTest2'
			AND [package0].[counter] <= (16)
			AND [resource_type]       = (6)
		)
	)

	ADD TARGET package0.event_file
	(
		SET
			filename           = N'C:\Junk\event_session_test3_EF.xel',
			max_file_size      = (20),
			max_rollover_files = (2)
	)

	WITH
	(
		MAX_MEMORY            = 4096 KB,
		EVENT_RETENTION_MODE  = ALLOW_SINGLE_EVENT_LOSS,
		MAX_DISPATCH_LATENCY  = 4 SECONDS,
		MAX_EVENT_SIZE        = 0 KB,
		MEMORY_PARTITION_MODE = NONE,
		TRACK_CAUSALITY       = OFF,
		STARTUP_STATE         = ON
	);

Cette étape termine la perspective de T-SQL.

B.3 Perspective de SELECT JOIN UNION dans l’affichage catalogue

N’ayez pas peur. L’instruction T-SQL SELECT suivante est longue uniquement car elle joint (avec des instructions UNION) plusieurs petites instructions SELECT. Chaque petite instruction SELECT peut être exécutée individuellement. Les petites instructions SELECT montrent comment les différents affichages catalogue système doivent être joints.

SELECT
		s.name        AS [Session-Name],
		'1_EVENT'     AS [Clause-Type],
		'Event-Name'  AS [Parameter-Name],
		e.name        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name         AS [Session-Name],
		'2_EVENT_SET'  AS [Clause-Type],
		f.name         AS [Parameter-Name],
		f.value        AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'3_EVENT_ACTION'    AS [Clause-Type],

		a.package + '.' + a.name
		                    AS [Parameter-Name],

		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_actions  As a

			ON  a.event_session_id = s.event_session_id
			AND a.event_id         = e.event_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                AS [Session-Name],
		'4_EVENT_PREDICATES'  AS [Clause-Type],
		e.predicate           AS [Parameter-Name],
		'(Not_Applicable)'    AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_events   AS e

			ON  e.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name              AS [Session-Name],
		'5_TARGET'          AS [Clause-Type],
		t.name              AS [Parameter-Name],
		'(Not_Applicable)'  AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name          AS [Session-Name],
		'6_TARGET_SET'  AS [Clause-Type],
		f.name          AS [Parameter-Name],
		f.value         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions         AS s
		JOIN  sys.server_event_session_targets  AS t

			ON  t.event_session_id = s.event_session_id

		JOIN  sys.server_event_session_fields   As f

			ON  f.event_session_id = s.event_session_id
			AND f.object_id        = t.target_id
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name               AS [Session-Name],
		'7_WITH_MAX_MEMORY'  AS [Clause-Type],
		'max_memory'         AS [Parameter-Name],
		s.max_memory         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

UNION ALL
SELECT
		s.name                  AS [Session-Name],
		'7_WITH_STARTUP_STATE'  AS [Clause-Type],
		'startup_state'         AS [Parameter-Name],
		s.startup_state         AS [Parameter-Value]
	FROM
		      sys.server_event_sessions  AS s
	WHERE
		s.name = 'event_session_test3'

ORDER BY
	[Session-Name],
	[Clause-Type],
	[Parameter-Name]
;

Sortie

Le tableau ci-après présente la sortie de l’exécution de l’instruction SELECT JOIN UNION précédente. Les noms et les valeurs des paramètres de sortie sont mappés à ce qui est clairement visible dans l’instruction CREATE EVENT SESSION précédente.

Nom de session Type de clause Nom du paramètre Valeur du paramètre
event_session_test3 1_EVENT Event-Name lock_deadlock
event_session_test3 2_EVENT_SET collect_database_name 1
event_session_test3 3_EVENT_ACTION sqlserver.client_hostname (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.collect_system_time (Not_Applicable)
event_session_test3 3_EVENT_ACTION sqlserver.event_sequence (Not_Applicable)
event_session_test3 4_EVENT_PREDICATES ([sqlserver]. [equal_i_sql_unicode_string] ([database_name],N’InMemTest2') AND [package0]. [compteur]<=(16)) (Not_Applicable)
event_session_test3 5_TARGET event_file (Not_Applicable)
event_session_test3 6_TARGET_SET filename C:\Junk\event_session_test3_EF.xel
event_session_test3 6_TARGET_SET max_file_size 20
event_session_test3 6_TARGET_SET max_rollover_files 2
event_session_test3 7_WITH_MAX_MEMORY max_memory 4096
event_session_test3 7_WITH_STARTUP_STATE startup_state 1

Cette étape termine la section sur les affichages catalogue.

C. Vues de gestion dynamique

Passons maintenant aux vues de gestion dynamique (DMV). Cette section fournit plusieurs instructions Transact-SQL SELECT, chacune ayant une fonction métier spécifique. Ces instructions SELECT montrent aussi comment joindre les DMV pour toute nouvelle utilisation souhaitée.

Vous trouverez de la documentation de référence sur les vues de gestion dynamique dans Vues de gestion dynamique des Événements étendus.

Dans cet article, toutes les lignes de sortie des instructions SELECT suivantes proviennent de SQL Server 2016, sauf indication contraire.

Voici la liste des instructions SELECT dans cette section C sur les vues de gestion dynamique :

C.1 Liste de tous les packages

Tous les objets que vous pouvez utiliser dans le domaine des événements étendus proviennent de packages qui sont chargés dans le système. Cette section répertorie tous les packages et leurs descriptions.

SELECT  --C.1
		p.name         AS [Package],
		p.description  AS [Package-Description]
	FROM
		sys.dm_xe_packages  AS p
	ORDER BY
		p.name;

Sortie

Voici la liste des packages.

Paquet Description du package
flux de fichier Événements étendus pour FILESTREAM et FileTable SQL Server
package0 Package par défaut. Contient l’ensemble des types, mappages, opérateurs de comparaison, actions et cibles standard
qds Événements étendus pour Magasin des requêtes
SecAudit Événements d’audit de sécurité
sqlclr Événements étendus pour SQL CLR
sqlos Événements étendus pour le système d’exploitation SQL
SQLSatellite Événements étendus pour SQL Satellite
sqlserver Événements étendus pour Microsoft SQL Server
sqlserver Événements étendus pour Microsoft SQL Server
sqlserver Événements étendus pour Microsoft SQL Server
sqlsni Événements étendus pour Microsoft SQL Server
ucs Événements étendus pour la pile de communications unifiées
XtpCompile Événements étendus pour la compilation XTP
XtpEngine Événements étendus pour le moteur XTP
XtpRuntime Événements étendus pour le runtime XTP

Définitions des abréviations précédentes :

  • clr = Common Language Runtime de .NET
  • qds = Query Data Store (magasin de données de requête)
  • sni = Server Network Interface (interface réseau du serveur)
  • ucs = Unified Communications Stack (pile de communications unifiées)
  • xtp = traitement transactionnel extrême

C.2 Quantité de chaque type d’objet

Cette section indique les types d’objets que contiennent les packages d’événements. Une liste complète s’affiche de tous les types d’objets qui se trouvent dans sys.dm_xe_objects, ainsi que le nombre pour chaque type.

SELECT  --C.2
		Count(*)  AS [Count-of-Type],
		o.object_type
	FROM
		sys.dm_xe_objects  AS o
	GROUP BY
		o.object_type
	ORDER BY
		1  DESC;

Sortie

Voici le nombre d’objets par type d’objet. Il existe environ 1915 objets.

Nombre de types object_type
1303 event
351 map
84 message
77 pred_compare
53 action
46 pred_source
28 type
17 cible

C.3 Sélectionner tous les éléments disponibles triés par type

L’instruction SELECT suivante retourne environ 1915 lignes, une par objet.

SELECT  --C.3
		o.object_type  AS [Type-of-Item],
		p.name         AS [Package],
		o.name         AS [Item],
		o.description  AS [Item-Description]
	FROM
		     sys.dm_xe_objects  AS o
		JOIN sys.dm_xe_packages AS p  ON o.package_guid = p.guid
	WHERE
		o.object_type IN ('action' , 'target' , 'pred_source')
		AND
		(
			(o.capabilities & 1) = 0
			OR
			o.capabilities IS NULL
		)
	ORDER BY
		[Type-of-Item],
		[Package],
		[Item];

Sortie

Pour vous mettre en appétit, voici un échantillonnage arbitraire des objets retournés par l’instruction SELECT précédente.

Type d’élément Paquet Élément Description d’élément
action package0 callstack Collecter la pile actuelle des appels
action package0 debug_break Arrêter le processus dans le débogueur par défaut
action sqlos task_time Collecter l’heure d’exécution de la tâche actuelle
action sqlserver sql_text Collecter le texte SQL
event qds query_store_aprc_regression Déclenché quand le Magasin des requêtes détecte une régression dans les performances du plan de requête
event SQLSatellite connection_accept Se produit lorsqu’une nouvelle connexion est acceptée. Cet événement permet de journaliser toutes les tentatives de connexion.
event XtpCompile cgen Se produit au début de la génération du code C.
map qds aprc_state État de correction de régression du plan automatique du Magasin des requêtes
message package0 histogram_event_required Une valeur est requise pour le paramètre « filtering_event_name » lorsque le type de source est 0.
pred_compare package0 equal_ansi_string Opérateur d’égalité entre deux valeurs de chaîne ANSI
pred_compare sqlserver equal_i_sql_ansi_string Opérateur d’égalité entre deux valeurs de chaîne SQL ANSI
pred_source sqlos task_execution_time Obtenir l’heure d’exécution de la tâche actuelle
pred_source sqlserver client_app_name Obtenir le nom de l’application cliente actuelle
cible package0 etw_classic_sync_target Cible synchrone de suivi d’événements pour Windows (ETW)
cible package0 event_counter Utilisez la cible event_counter pour comptabiliser le nombre d’occurrences de chaque événement dans la session d’événements.
cible package0 event_file Utilisez la cible event_file pour enregistrer les données d’événement dans un fichier XEL, lequel peut être archivé et utilisé ultérieurement à des fins d’analyse et de vérification. Vous pouvez fusionner plusieurs fichiers XEL pour obtenir une vue des données combinées provenant de sessions d’événements distinctes.
cible package0 histogram Utilisez la cible histogram pour agréger les données d’événement en fonction d’une action ou d’un champ de données d’événement spécifique associé à l’événement. L’histogramme vous permet d’analyser la distribution des données d’événement tout au long de la période relative à la session d’événements.
cible package0 pair_matching Cible d’appariement
cible package0 ring_buffer Cible de mémoire tampon en anneau asynchrone
type package0 xml Fragment XML bien formé

C.4 Champs de données disponibles pour votre événement

L’instruction SELECT suivante retourne tous les champs de données propres à votre type d’événement.

  • Notez l’élément de clause WHERE : column_type = 'data'.
  • Vous devez aussi modifier la valeur de la clause WHERE pour o.name =.
SELECT  -- C.4
		p.name         AS [Package],
		c.object_name  AS [Event],
		c.name         AS [Column-for-Predicate-Data],
		c.description  AS [Column-Description]
	FROM
		      sys.dm_xe_object_columns  AS c
		JOIN  sys.dm_xe_objects         AS o

			ON  o.name = c.object_name

		JOIN  sys.dm_xe_packages        AS p

			ON  p.guid = o.package_guid
	WHERE
		c.column_type = 'data'
		AND
		o.object_type = 'event'
		AND
		o.name        = '\<EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Event],
		[Column-for-Predicate-Data];

Sortie

Les lignes suivantes ont été retournées par l’instruction précédente SELECT, WHERE o.name = 'lock_deadlock':

  • Chaque ligne représente un filtre facultatif pour l’événement sqlserver.lock_deadlock .
  • La colonne [Column-Description] est omise à partir de l’affichage suivant. Sa valeur est souvent NULL.
  • Il s’agit de la sortie réelle, à l’exception de la colonne de description omise dont la valeur est souvent NULL.
  • Ces lignes se situent là où object_type = « lock_deadlock ».
Paquet Événement Colonne pour les données de prédicat
sqlserver lock_deadlock associated_object_id
sqlserver lock_deadlock database_id
sqlserver lock_deadlock database_name
sqlserver lock_deadlock deadlock_id
sqlserver lock_deadlock durée
sqlserver lock_deadlock lockspace_nest_id
sqlserver lock_deadlock lockspace_sub_id
sqlserver lock_deadlock lockspace_workspace_id
sqlserver lock_deadlock mode
sqlserver lock_deadlock object_id
sqlserver lock_deadlock owner_type
sqlserver lock_deadlock resource_0
sqlserver lock_deadlock resource_1
sqlserver lock_deadlock resource_2
sqlserver lock_deadlock resource_description
sqlserver lock_deadlock resource_type
sqlserver lock_deadlock transaction_id

C.5 sys.dm_xe_map_values et champs d’événements

L’instruction SELECT suivante inclut une jointure à la vue délicate nommée sys.dm_xe_map_values.

L’instruction SELECT affiche les nombreux champs parmi lesquels vous pouvez choisir pour votre session d’événements. Vous pouvez utiliser les champs d’événements de deux manières :

  • Pour choisir les valeurs de champs qui seront écrites dans votre cible pour chaque occurrence d’événement.
  • Pour filtrer les occurrences des événements qui seront envoyées à la cible plutôt que conservées.
SELECT  --C.5
		dp.name         AS [Package],
		do.name         AS [Object],
		do.object_type  AS [Object-Type],
		'o--c'     AS [O--C],
		dc.name         AS [Column],
		dc.type_name    AS [Column-Type-Name],
		dc.column_type  AS [Column-Type],
		dc.column_value AS [Column-Value],
		'c--m'     AS [C--M],
		dm.map_value    AS [Map-Value],
		dm.map_key      AS [Map-Key]
	FROM
		      sys.dm_xe_objects         AS do
		JOIN  sys.dm_xe_object_columns  AS dc

			ON  dc.object_name = do.name

		JOIN  sys.dm_xe_map_values      AS dm

			ON  dm.name = dc.type_name

		JOIN  sys.dm_xe_packages        AS dp

			ON  dp.guid = do.package_guid
	WHERE
		do.object_type = 'event'
		AND
		do.name        = '\<YOUR-EVENT-NAME-HERE!>'  --'lock_deadlock'
	ORDER BY
		[Package],
		[Object],
		[Column],
		[Map-Value];

Sortie

Voici un échantillonnage des 153 lignes de sortie de l’instruction T-SQL SELECT précédente. La ligne pour resource_type est pertinente au filtrage de prédicat utilisé dans l’exemple event_session_test3 ailleurs dans cet article.

/***  5 sampled rows from the actual 153 rows returned.
	NOTE:  'resource_type' under 'Column'.

Package     Object          Object-Type   O--C   Column          Column-Type-Name     Column-Type   Column-Value   C--M   Map-Value        Map-Key
-------     ------          -----------   ----   ------          ----------------     -----------   ------------   ----   ---------        -------
sqlserver   lock_deadlock   event         o--c   CHANNEL         etw_channel          readonly      2              c--m   Operational      4
sqlserver   lock_deadlock   event         o--c   KEYWORD         keyword_map          readonly      16             c--m   access_methods   1024
sqlserver   lock_deadlock   event         o--c   mode            lock_mode            data          NULL           c--m   IX               8
sqlserver   lock_deadlock   event         o--c   owner_type      lock_owner_type      data          NULL           c--m   Cursor           2
sqlserver   lock_deadlock   event         o--c   resource_type   lock_resource_type   data          NULL           c--m   PAGE             6

Therefore, on your CREATE EVENT SESSION statement, in its ADD EVENT WHERE clause,
you could put:
	WHERE( ... resource_type = 6 ...)  -- Meaning:  6 = PAGE.
***/

C.6 Paramètres pour les cibles

L’instruction SELECT suivante retourne chaque paramètre pour votre cible. Chaque paramètre est balisé pour indiquer s’il est obligatoire. Les valeurs que vous assignez aux paramètres affectent le comportement de la cible.

  • Notez l’élément de clause WHERE : object_type = 'customizable'.
  • Vous devez aussi modifier la valeur de la clause WHERE pour o.name =.
SELECT  --C.6
		p.name        AS [Package],
		o.name        AS [Target],
		c.name        AS [Parameter],
		c.type_name   AS [Parameter-Type],

		CASE c.capabilities_desc
			WHEN 'mandatory' THEN 'YES_Mandatory'
			ELSE 'Not_mandatory'
		END  AS [IsMandatoryYN],

		c.description AS [Parameter-Description]
	FROM
		      sys.dm_xe_objects   AS o
		JOIN  sys.dm_xe_packages  AS p

			ON  o.package_guid = p.guid

		LEFT OUTER JOIN  sys.dm_xe_object_columns  AS c

			ON  o.name        = c.object_name
			AND c.column_type = 'customizable'  -- !
	WHERE
		o.object_type = 'target'
		AND
		o.name     LIKE '%'    -- Or '\<YOUR-TARGET-NAME-HERE!>'.
	ORDER BY
		[Package],
		[Target],
		[IsMandatoryYN]  DESC,
		[Parameter];

Sortie

Les lignes de paramètres suivantes sont un sous-ensemble des éléments retournés par l’instruction SELECT précédente, dans SQL Server 2016.

/***  Actual output, all rows, where target name = 'event_file'.
Package    Target       Parameter            Parameter-Type       IsMandatoryYN   Parameter-Description
-------    ------       ---------            --------------       -------------   ---------------------
package0   event_file   filename             unicode_string_ptr   YES_Mandatory   Specifies the location and file name of the log
package0   event_file   increment            uint64               Not_mandatory   Size in MB to grow the file
package0   event_file   lazy_create_blob     boolean              Not_mandatory   Create blob upon publishing of first event buffer, not before.
package0   event_file   max_file_size        uint64               Not_mandatory   Maximum file size in MB
package0   event_file   max_rollover_files   uint32               Not_mandatory   Maximum number of files to retain
package0   event_file   metadatafile         unicode_string_ptr   Not_mandatory   Not used
***/

C.7 Transtypage SELECT DMV de colonne target_data en XML

Cette instruction SELECT de DMV retourne les lignes de données à partir de la cible de votre session d’événements active. Les données sont converties au format XML, ce qui rend la cellule retournée interactive pour faciliter l’affichage dans SSMS.

  • Si votre session d’événements est arrêtée, cette instruction SELECT retourne zéro ligne.
  • Vous devez modifier la valeur de la clause WHERE pour s.name =.
SELECT  --C.7
		s.name,
		t.target_name,
		CAST(t.target_data AS XML)  AS [XML-Cast]
	FROM
		      sys.dm_xe_session_targets  AS t
		JOIN  sys.dm_xe_sessions         AS s

			ON s.address = t.event_session_address
	WHERE
		s.name = '\<Your-Session-Name-Here!>';

Sortie : une seule ligne, y compris sa cellule XML

Voici la seule ligne générée à partir de l’instruction SELECT précédente. La colonne XML-Cast contient une chaîne XML que SSMS comprend comme étant du XML. Ainsi, SSMS comprend qu’il doit rendre la cellule XML-Cast interactive.

Pour cette séquence :

  • s.name = a pris comme valeur une session d’événements pour l’événement checkpoint_begin .
  • La cible était un ring_buffer.
name                              target_name   XML-Cast
----                              -----------   --------
checkpoint_session_ring_buffer2   ring_buffer   <RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104"><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event><event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z"><data name="database_id"><type name="uint32" package="package0" /><value>5</value></data></event></RingBufferTarget>

Sortie : XML affiché correctement en cas de clic sur la cellule

Quand vous cliquez sur la cellule XML-Cast, vous obtenez l’affichage suivant.

<RingBufferTarget truncated="0" processingTime="0" totalEventsProcessed="2" eventCount="2" droppedCount="0" memoryUsed="104">
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:23.508Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
  <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T01:28:26.975Z">
    <data name="database_id">
      <type name="uint32" package="package0" />
      <value>5</value>
    </data>
  </event>
</RingBufferTarget>

C.8 Sélectionner à partir d’une fonction pour extraire des données event_file à partir du lecteur de disque

Supposez que votre session d’événements a collecté des données puis a été arrêtée. Si votre session a été définie pour utiliser la cible event_file, vous pouvez toujours récupérer les données en appelant la fonction sys.fn_xe_target_read_file.

  • Vous devez modifier votre chemin et votre nom de fichier dans le paramètre de l’appel de fonction avant d’exécuter cette instruction SELECT.
    • Ne faites pas attention aux chiffres supplémentaires incorporés par le système SQL dans vos noms de fichiers .XEL chaque fois que vous redémarrez votre session. Affectez simplement le nom racine et l’extension ordinaires.
SELECT  --C.8
		f.module_guid,
		f.package_guid,
		f.object_name,
		f.file_name,
		f.file_offset,
		CAST(f.event_data AS XML)  AS [Event-Data-As-XML]
	FROM
		sys.fn_xe_file_target_read_file(

			'\<YOUR-PATH-FILE-NAME-ROOT-HERE!>*.xel',
			--'C:\Junk\Checkpoint_Begins_ES*.xel',  -- Example.

			NULL, NULL, NULL
		)  AS f;

Sortie : lignes retournées par l’instruction SELECT

Voici les lignes retournées par l’instruction SELECT précédente. La colonne XML de droite contient les données qui sont propres à l’occurrence d’événement.

module_guid                            package_guid                           object_name        file_name                                                           file_offset   Event-Data-As-XML
-----------                            ------------                           -----------        ---------                                                           -----------   -----------------
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5120          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:14.025Z"><data name="database_id"><value>5</value></data></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_begin   C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:17.704Z"><data name="database_id"><value>5</value></data><action name="session_id" package="sqlserver"><value>60</value></action><action name="database_id" package="sqlserver"><value>5</value></action></event>
D5149520-6282-11DE-8A39-0800200C9A66   03FDA7D0-91BA-45F8-9875-8B6DD0B8E9F2   checkpoint_end     C:\Junk\Checkpoint_Begins_ES_20160615bb-_0_131125086091700000.xel   5632          <event name="checkpoint_end" package="sqlserver" timestamp="2016-07-09T03:30:17.709Z"><data name="database_id"><value>5</value></data></event>

Sortie : une cellule XML

Voici le contenu de la première cellule XML, tirée de l’ensemble de lignes retourné précédent.

<event name="checkpoint_begin" package="sqlserver" timestamp="2016-07-09T03:30:14.023Z">
  <data name="database_id">
    <value>5</value>
  </data>
  <action name="session_id" package="sqlserver">
    <value>60</value>
  </action>
  <action name="database_id" package="sqlserver">
    <value>5</value>
  </action>
</event>