Inicio rápido: Eventos extendidos
Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance
Eventos extendidos es una característica ligera de supervisión de rendimiento que permite a los usuarios recopilar los datos necesarios para supervisar y solucionar problemas. Mediante el uso de eventos Extendidos, puedes ver detalles de las operaciones internas del motor de base de datos que son relevantes para la supervisión del rendimiento y la solución de problemas. Consulte Introducción a los Eventos extendidos para obtener más información sobre los Eventos extendidos.
Este artículo tiene como objetivo ayudar a los administradores, ingenieros y desarrolladores de SQL que son nuevos en Eventos extendidos y que quieren empezar a usarlo y ver datos de eventos en cuestión de minutos.
Los Eventos extendidos también se conocen como XEvents y, a veces, solo como XE.
Después de leer este artículo, podrás hacer lo siguiente:
- Consultar cómo crear una sesión de eventos en SQL Server Management Studio (SSMS), con capturas de pantalla de ejemplo
- Correlacionar las capturas de pantalla con las instrucciones Transact-SQL equivalentes
- Comprender en detalles los términos y conceptos subyacentes a la interfaz de usuario de SSMS y las instrucciones T-SQL de XEvents
- Descubrir cómo probar la sesión de eventos
- Comprender los resultados de la sesión, entre los que se incluyen:
- Opciones disponibles para el almacenamiento de resultados
- Resultados procesados frente a los resultados sin procesar
- Herramientas para ver los resultados de diferentes maneras y en diferentes escalas de tiempo
- Descubre cómo puedes buscar y detectar todos los eventos disponibles
- Descripción de las relaciones entre las vistas del sistema de Eventos extendidos
Sugerencia
Para obtener más información sobre los Eventos extendidos de la base de datos de Azure SQL, incluidos los ejemplos de código, consulte Eventos extendidos en base de datos de Azure SQL y Azure SQL Managed Instance.
Requisitos previos
Para empezar, necesitarás lo siguiente:
- Descargue SQL Server Management Studio (SSMS). Se recomienda usar una versión reciente de SSMS con las mejoras y correcciones más recientes.
- Asegúrese de que su cuenta tenga el permiso de servidor de
ALTER ANY EVENT SESSION
.
Puedes encontrar más información disponible sobre seguridad y permisos relacionados con los Eventos extendidos al final de este artículo en el Apéndice.
Eventos extendidos en SSMS
SSMS proporciona una interfaz de usuario (UI) totalmente funcional para Eventos extendidos. Esta interfaz de usuario sirve para muchos escenarios, sin tener que usar vistas de administración dinámica (DMV) o T-SQL.
En la siguiente sección, puede ver los pasos de la interfaz de usuario para crear una sesión de Eventos extendidos, y para ver los datos que notifica. Después de seguir los pasos prácticos o revisarlos en este artículo, puedes leer los conceptos implicados en los pasos para una comprensión más profunda.
Crear una sesión de evento en SSMS
Cuando crea una sesión de Eventos extendidos, indica al sistema:
- Qué eventos te interesan
- Cómo quieres que el sistema te notifique los datos
La demostración abre el cuadro de diálogo Nueva sesión, muestra cómo usar tus cuatro páginas, denominadas:
- General
- Eventos
- Almacenamiento de datos
- Avanzado
El texto y las capturas de pantalla auxiliares pueden ser ligeramente diferentes en la versión de SSMS, pero deben ser relevantes para la explicación de los conceptos básicos.
Conexión a una instancia del motor de base de datos. Los Eventos extendidos se admiten a partir de SQL Server 2014 (12.x), en Azure SQL Database y Azure SQL Managed Instance.
En el Explorador de objetos de SSMS, selecciona Administración> Eventos extendidos. En Azure SQL Database, las sesiones de eventos tienen como ámbito la base de datos, por lo que la opción Eventos extendidos se encuentra en cada base de datos, no en Administración. Haz clic con el botón derecho en Sesiones y selecciona Nueva sesión. Es preferible usar el cuadro de diálogo Nueva sesión que el Asistente para nueva sesión, aunque ambos son similares.
Seleccione la página General. Después, escribe
YourSession
, o cualquier nombre que quieras, en el cuadro de texto Nombre de sesión. No selecciones Aceptar todavía, ya que aún tienes que escribir algunos detalles en otras páginas.Seleccione la páginaEventos.
En el área Biblioteca de eventos, en la lista desplegable, elige Solo los nombres de evento.
- Escribe
sql_statement_
en el cuadro de texto. Esto filtra la lista para mostrar solo los eventos consql_statement_
en el nombre. - Desplázate y selecciona el evento denominado
sql_statement_completed
. - Selecciona el botón de flecha derecha
>
para mover el evento al cuadro Eventos seleccionados.
- Escribe
Quédese en la página Eventos y seleccione el botón Configurar. Se abrirá el cuadro Opciones de configuración de eventos para los eventos seleccionados.
Selecciona la pestaña Filtro (predicado). A continuación, selecciona Seleccionar aquí para agregar una cláusula. Configuramos este filtro (también conocido como predicado) para capturar todas las instrucciones
SELECT
que tienen una cláusulaHAVING
.En la lista desplegable Campo, elige
sqlserver.sql_text
.- En Operador, elige
like_i_sql_unicode_string
. Aquí,i
en el nombre del operador significa que no distingue mayúsculas de minúsculas. - En Valor, escribe
%SELECT%HAVING%
. Aquí, los signos porcentuales son caracteres comodín para cualquier cadena de caracteres.
Nota:
En el nombre de dos partes del campo, sqlserver es el nombre del paquete y sql_text, el nombre del campo. El evento que hemos elegido anteriormente, sql_statement_completed, debe encontrarse en el mismo paquete que el campo que hemos elegido.
- En Operador, elige
Seleccione la página Almacenamiento de datos.
En el área Destinos, selecciona Selecciona aquí para agregar un destino.
- En la lista desplegable Tipo, elige
event_file
. Esto significa que los datos del evento se almacenan en un archivo que podamos abrir y ver más tarde. En Azure SQL Managed Instance o Azure SQL Database, los datos de evento se almacenan en blobs de Azure Storage.
Nota:
A partir de SQL Server 2019 (15.x), puede usar Azure Blob Storage en un destino
event_file
de SQL Server.- En la lista desplegable Tipo, elige
En el área Propiedades, escribe la ruta de acceso completa y el nombre de archivo en el cuadro de texto Nombre de archivo en el servidor. También puede usar el botón Examinar. La extensión del nombre de archivo debe ser
xel
. En el ejemplo, se usaC:\Temp\YourSession_Target.xel
Seleccione la página Avanzadas. Reduce la latencia máxima de envío a 3 segundos.
Selecciona el botón Aceptar en la parte inferior para crear esta sesión de eventos.
De nuevo en Explorador de objetos, abre o actualiza la carpeta Sesiones y consulta el nuevo nodo para
YourSession
. La sesión aún no se ha iniciado. La inicias más tarde.
Editar una sesión de eventos en SSMS
En el Explorador de objetos de SSMS, puedes editar la sesión de eventos al hacer clic con el botón derecho en su nodo y, después, seleccionar Propiedades. Se muestra el mismo cuadro de diálogo de varias páginas.
Crear una sesión de eventos mediante T-SQL
En la interfaz de usuario de Eventos extendidos de SSMS, puedes generar un script de T-SQL para crear la sesión de eventos de la siguiente manera:
- Haz clic con el botón derecho en el nodo de sesión de eventos y, a continuación, selecciona Script de sesión como > CREATE en > Portapapeles.
- Péguelo en cualquier editor de texto.
Esta es la instrucción T-SQL CREATE EVENT SESSION
generada para YourSession
:
CREATE EVENT SESSION [YourSession]
ON SERVER -- For SQL Server and Azure SQL Managed Instance
-- ON DATABASE -- For Azure SQL Database
ADD EVENT sqlserver.sql_statement_completed
(
ACTION(sqlserver.sql_text)
WHERE
( [sqlserver].[like_i_sql_unicode_string]([sqlserver].[sql_text], N'%SELECT%HAVING%')
)
)
ADD TARGET package0.event_file
(SET
filename = N'C:\Temp\YourSession_Target.xel',
max_file_size = (2),
max_rollover_files = (2)
)
WITH (
MAX_MEMORY = 2048 KB,
EVENT_RETENTION_MODE = ALLOW_MULTIPLE_EVENT_LOSS,
MAX_DISPATCH_LATENCY = 3 SECONDS,
MAX_EVENT_SIZE = 0 KB,
MEMORY_PARTITION_MODE = NONE,
TRACK_CAUSALITY = OFF,
STARTUP_STATE = OFF
);
GO
DROP condicional de la sesión de eventos
Antes de la instrucción CREATE EVENT SESSION
, puedes ejecutar condicionalmente una instrucción DROP EVENT SESSION
, en caso de que ya exista una sesión con el mismo nombre. Esto elimina la sesión existente. Sin esto, al intentar crear una sesión con el mismo nombre se produce un error.
IF EXISTS (SELECT *
FROM sys.server_event_sessions
WHERE name = 'YourSession')
BEGIN
DROP EVENT SESSION YourSession
ON SERVER;
END
GO
Iniciar y detener la sesión de eventos mediante T-SQL
Cuando crea una sesión de eventos, el valor predeterminado consiste en no iniciar la ejecución automáticamente. Puedes iniciar o detener la sesión de eventos en cualquier momento mediante la siguiente instrucción ALTER EVENT SESSION
de T-SQL.
ALTER EVENT SESSION [YourSession]
ON SERVER
STATE = START; -- STOP;
Tienes la opción de configurar la sesión de eventos para que se inicie automáticamente cuando lo haga la instancia del motor de base de datos. Vea la palabra clave STARTUP STATE = ON
en CREATE EVENT SESSION
.
La interfaz de usuario de SSMS ofrece una casilla correspondiente, Iniciar la sesión de eventos al iniciar el servidor, en la página Nueva sesión > General.
Probar una sesión de eventos
Prueba la sesión de eventos con estos pasos:
- En el Explorador de objetos, haz clic con el botón derecho en el nodo de la sesión de eventos y, después, selecciona Iniciar sesión.
- Mientras estás conectado al mismo servidor (o a la misma base de datos de Azure SQL Database) donde creó la sesión de eventos, ejecuta la siguiente instrucción
SELECT...HAVING
un par de veces. Considera la posibilidad de cambiar el valor de la cláusulaHAVING
para cada ejecución, alternando entre 2 y 3. Esto le permite ver las diferencias en los resultados. - Haz clic con el botón derecho en el nodo de la sesión y, después, selecciona Detener sesión.
- Lea la siguiente subsección sobre cómo usar SELECT y ver los resultados.
SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;
Para completar, este es el resultado esperado del comando SELECT...HAVING
anterior.
/* Approximate output, 6 rows, all HAVING Count >= 3:
name Count-Per-Column-Repeated-Name
--------------------- ------------------------------
event_group_type 4
event_group_type_desc 4
event_session_address 5
event_session_id 5
is_trigger_event 4
trace_event_id 3
*/
Ver datos de sesiones de eventos como XML
En una ventana de consulta de SSMS, ejecuta la siguiente instrucción SELECT
para ver los datos de eventos capturados por la sesión. Cada fila representa una repetición de eventos. CAST(... AS xml)
cambia el tipo de datos de la columna de nvarchar a xml. Esto le permite seleccionar el valor de columna para abrirlo en una nueva ventana a fin de facilitar la lectura.
Nota:
El destino event_file
siempre inserta una parte numérica en el nombre de archivo xel
. Para poder ejecutar la consulta siguiente, debes copiar el nombre completo real del archivo xel
que incluye esta parte numérica y pegarlo en la instrucción SELECT
. En el ejemplo siguiente, la parte numérica es _0_131085363367310000
.
SELECT object_name,
file_name,
file_offset,
event_data,
'CLICK_NEXT_CELL_TO_BROWSE_XML RESULTS!' AS [CLICK_NEXT_CELL_TO_BROWSE_XML_RESULTS],
CAST(event_data AS XML) AS [event_data_XML]
-- TODO: In the SSMS results grid, click this XML cell
FROM sys.fn_xe_file_target_read_file(
'C:\Temp\YourSession_Target_0_131085363367310000.xel', NULL, NULL, NULL
);
Esta consulta proporciona dos maneras de ver los resultados completos de cualquier fila de eventos determinada:
Ejecuta la instrucción SELECT en SSMS y, después, haz clic en una celda de la
event_data_XML
.Copie la cadena XML de una celda en la columna
event_data
. Pégala en un editor de texto sencillo como Notepad y guarda la cadena en un archivo con extensiónxml
. A continuación, abre el archivo en un explorador o en un editor capaz de mostrar datos XML.
Datos de eventos en XML
A continuación, podemos ver parte de los resultados que se encuentran en formato XML. Aquí se edita el XML para mayor brevedad. Ten en cuenta que <data name="row_count">
muestra el valor de 6
, que coincide con las 6 filas de resultados que hemos mostrado anteriormente. Y podemos ver la instrucción SELECT
completa.
<event name="sql_statement_completed" package="sqlserver" timestamp="2016-05-24T04:06:08.997Z">
<data name="duration">
<value>111021</value>
</data>
<data name="cpu_time">
<value>109000</value>
</data>
<data name="physical_reads">
<value>0</value>
</data>
<data name="last_row_count">
<value>6</value>
</data>
<data name="offset">
<value>0</value>
</data>
<data name="offset_end">
<value>584</value>
</data>
<data name="statement">
<value>SELECT c.name,
COUNT(*) AS [Count-Per-Column-Repeated-Name]
FROM sys.syscolumns AS c
INNER JOIN sys.sysobjects AS o
ON o.id = c.id
WHERE o.type = 'V'
AND c.name LIKE '%event%'
GROUP BY c.name
HAVING Count(*) >= 3 --2 -- Try both values during session.
ORDER BY c.name;</value>
</data>
</event>
Visualizar datos de sesión de eventos en SSMS
Existen varias características avanzadas en la interfaz de usuario de SSMS que puede usar para ver los datos capturados de una sesión de eventos. Para más información, consulta Ver datos de eventos en SQL Server Management Studio.
Comienzas con las opciones del menú contextual denominadas Ver datos de destino y Observar datos en directo.
Ver datos de destino
En el Explorador de objetos de SSMS, puedes hacer clic con el botón derecho en el nodo de destino que se encuentra debajo del nodo de la sesión de eventos. En el menú contextual, selecciona Ver datos de destino. SSMS muestra los datos.
La visualización no se actualiza a medida que se producen nuevos eventos en una sesión. Pero puedes seleccionar Ver datos de destino de nuevo.
Observar datos en directo
En el Explorador de objetosde SSMS, puede hacer clic con el botón derecho en el nodo de la sesión de eventos. En el menú contextual, selecciona Observar datos en directo. SSMS muestra los datos entrantes a medida que llegan en tiempo real.
Términos y conceptos de los Eventos extendidos
En la siguiente tabla se enumeran los términos que se usan en los Eventos extendidos, y se describe su significado.
Término | Descripción |
---|---|
event session |
Una construcción que se centra en torno a uno o más eventos, además de elementos complementarios como acciones y destinos. La instrucción CREATE EVENT SESSION crea cada sesión de eventos. Puedes ALTER una sesión de eventos para iniciarla y detenerla a tu voluntad.A veces, se hace referencia a una sesión de eventos solo como sesión, cuando el contexto lo aclara significa sesión de eventos. Puedes encontrar más información sobre las sesiones de eventos en Sesiones de Eventos extendidos. |
event |
Una repetición específica en el sistema que se observa mediante una sesión de eventos activa. Por ejemplo, el evento sql_statement_completed representa el momento en que cualquier instrucción T-SQL se completa. El evento puede notificar su duración y otros datos. |
target |
Un elemento que recibe los datos de salida de un evento capturado. El destino le muestra los datos. Entre los ejemplos se incluyen el destino event_file que se usó anteriormente en este inicio rápido y el destino ring_buffer que mantiene los eventos más recientes en la memoria.Puede usarse cualquier tipo de destino para cualquier sesión de eventos. Para más información, consulta Destinos para Eventos extendidos. |
action |
Un campo conocido del evento. Los datos del campo se envían al destino. El campo de acción está estrechamente relacionado con el filtro de predicado. |
predicate o filtro |
Una prueba de datos en un campo de evento que se usa de forma que solo un subconjunto interesante de las repeticiones de evento se envíe al destino. Por ejemplo, un filtro podría incluir solo esas repeticiones del evento sql_statement_completed donde la instrucción T-SQL incluía la cadena HAVING . |
package |
Un calificador de nombre adjunto a cada elemento de un conjunto de elementos que se centra en torno al núcleo de los eventos. Por ejemplo, un paquete puede tener eventos sobre texto T-SQL. Un evento puede tratar todas las instrucciones T-SQL en un lote. Mientras tanto, otro evento más reducido trata sobre las instrucciones T-SQL individuales. Además, para cualquier instrucción T-SQL, existen eventos started y completed .Los campos apropiados para los eventos también se encuentran en el paquete con los eventos. La mayoría de los destinos se encuentran en package0 y se usan con eventos de muchos otros paquetes. |
Escenarios de Eventos extendidos y detalles de uso
Hay numerosos escenarios para usar Eventos extendidos a fin de supervisar y solucionar problemas del motor de base de datos y las cargas de trabajo de consulta. En los artículos siguientes se proporcionan ejemplos de uso de escenarios relacionados con bloqueos:
- Buscar los objetos que han obtenido más bloqueos
- En este escenario se usa el destino histogram, que procesa los datos de eventos sin procesar antes de mostrártelos de forma resumida (agrupada).
- Determinar las consultas que retienen bloqueos
- En este escenario se usa el destino pair_matching, donde el par de eventos es
sqlserver.lock_acquire
ysqlserver.lock_release
.
- En este escenario se usa el destino pair_matching, donde el par de eventos es
Cómo detectar eventos disponibles en paquetes
La siguiente consulta devuelve una fila para cada evento disponible cuyo nombre contenga la cadena de tres caracteres sql
. Puedes editar la cláusula LIKE
para buscar nombres de evento diferentes. El conjunto de resultados también identifica el paquete que contiene el evento.
SELECT -- Find an event you want.
p.name AS [Package-Name],
o.object_type,
o.name AS [Object-Name],
o.description AS [Object-Descr],
p.guid AS [Package-Guid]
FROM sys.dm_xe_packages AS p
INNER JOIN sys.dm_xe_objects AS o
ON p.guid = o.package_guid
WHERE o.object_type = 'event' --'action' --'target'
AND p.name LIKE '%'
AND o.name LIKE '%sql%'
ORDER BY p.name,
o.object_type,
o.name;
En el ejemplo de resultado siguiente se muestra la fila devuelta, dinamizada aquí en el formato de column name = value
. Los datos provienen del evento sql_statement_completed
que se ha usado en los pasos anteriores del ejemplo. La descripción del objeto (un evento, en este ejemplo) sirve como una cadena de documentación.
Package-Name = sqlserver
object_type = event
Object-Name = sql_statement_completed
Object-Descr = Occurs when a Transact-SQL statement has completed.
Package-Guid = 655FD93F-3364-40D5-B2BA-330F7FFB6491
Búsqueda de eventos mediante la interfaz de usuario de SSMS
Otra opción de búsqueda de eventos por nombre es usar el cuadro de diálogo Nueva sesión > Eventos > Biblioteca de eventos que se muestra en una captura de pantalla anterior. Puedes escribir un nombre de evento parcial y buscar todos los nombres de eventos coincidentes.
Clase del evento de Seguimiento de SQL
Puede obtener una descripción de cómo usar Eventos extendidos con las columnas y clases de evento de Seguimiento de SQL en: Ver los Eventos extendidos equivalentes a las clases de evento de Seguimiento de SQL Server.
Event Tracing for Windows (ETW: Seguimiento de eventos para Windows)
Las descripciones de cómo usar Eventos extendidos con Seguimiento de eventos para Windows (ETW) están disponibles en:
- Seguimiento de eventos para Windows como destino
- Supervisar la actividad del sistema mediante eventos extendidos
Sesiones de eventos del sistema
En SQL Server y Azure SQL Managed Instance, se crean varias sesiones de eventos del sistema de forma predeterminada y se configuran para iniciarse cuando se inicia el motor de base de datos. Al igual que la mayoría de las sesiones de eventos, consumen una pequeña cantidad de recursos y no afectan materialmente al rendimiento de la carga de trabajo. Microsoft recomienda que estas sesiones permanezcan habilitadas y en ejecución. Las sesiones de mantenimiento, especialmente la sesión system_health, suelen ser útiles para la supervisión y la solución de problemas.
Puedes ver estas sesiones de eventos en el Explorador de objetos de SSMS en Administración > Eventos extendidos > Sesiones. Por ejemplo, en SQL Server, estas sesiones de eventos del sistema son las siguientes:
AlwaysOn_health
system_health
telemetry_events
Proveedor de PowerShell
Puedes administrar los Eventos extendidos mediante el proveedor de SQL Server PowerShell. Para obtener más información, vea Usar el proveedor de PowerShell para eventos extendidos.
Vistas del sistema
Las vistas del sistema para Eventos extendidos incluyen:
- Vistas de catálogo: para obtener información sobre las sesiones de eventos que se han definido mediante
CREATE EVENT SESSION
. - Vistas de administración dinámica (DMV): para obtener información sobre sesiones de eventos (iniciados) activos.
Instrucciones SELECT y JOIN en vistas del sistema para Eventos extendidos en SQL Server proporciona información sobre lo siguiente:
- Cómo unir las vistas
- Varias consultas útiles basadas en estas vistas
- La correlación entre:
- Ver columnas
- Cláusulas
CREATE EVENT SESSION
- La interfaz de usuario de SSMS
Apéndice: Consultas para buscar titulares de permisos de Eventos extendidos
Los permisos que se mencionan en este artículo son:
ALTER ANY EVENT SESSION
VIEW SERVER STATE
CONTROL SERVER
La siguiente instrucción SELECT...UNION ALL
devuelve filas que muestran quién tiene los permisos necesarios para crear sesiones de eventos y consultar las vistas de catálogo del sistema de los Eventos extendidos.
-- Ascertain who has the permissions listed in the ON clause.
-- 'CONTROL SERVER' permission includes the permissions
-- 'ALTER ANY EVENT SESSION' and 'VIEW SERVER STATE'.
SELECT 'Owner-is-Principal' AS [Type-That-Owns-Permission],
NULL AS [Role-Name],
prin.name AS [Owner-Name],
PERM.permission_name COLLATE Latin1_General_CI_AS_KS_WS AS [Permission-Name]
FROM sys.server_permissions AS PERM
INNER JOIN sys.server_principals AS prin
ON prin.principal_id = PERM.grantee_principal_id
WHERE PERM.permission_name IN (
'ALTER ANY EVENT SESSION',
'VIEW SERVER STATE',
'CONTROL SERVER'
)
UNION ALL
-- Plus check for members of the 'sysadmin' fixed server role,
-- because 'sysadmin' includes the 'CONTROL SERVER' permission.
SELECT 'Owner-is-Role',
prin.name, -- [Role-Name]
CAST((IsNull(pri2.name, N'No members')) AS NVARCHAR(128)),
NULL
FROM sys.server_role_members AS rolm
RIGHT JOIN sys.server_principals AS prin
ON prin.principal_id = rolm.role_principal_id
LEFT JOIN sys.server_principals AS pri2
ON rolm.member_principal_id = pri2.principal_id
WHERE prin.name = 'sysadmin';
HAS_PERMS_BY_NAME, función
La siguiente instrucción SELECT
informa de los permisos. Se basa en la función integrada HAS_PERMS_BY_NAME.
Además, si tienes la autoridad de suplantar temporalmente otros inicios de sesión, puedes quitar la marca de comentario de las instrucciones EXECUTE AS LOGIN y REVERT
para ver si otros inicios de sesión contienen el permiso ALTER ANY EVENT SESSION
.
--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;