Compartir por


Destinos de eventos extendidos

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLBase de datos SQL en Microsoft Fabric

En este artículo se explica cuándo y cómo usar los destinos de Eventos extendidos. Para cada destino, en el artículo se describe lo siguiente:

  • Sus capacidades en la recopilación y generación de informes de datos de eventos
  • Ejemplos de sesiones de eventos utilizando el objetivo

En la tabla siguiente se describe la disponibilidad de cada tipo de destino en distintas plataformas SQL.

Tipo de destino Servidor SQL Azure SQL Database y SQL Database en Fabric Instancia administrada de Azure SQL
archivo_de_evento
ring_buffer
event_stream
histograma
contador_de_eventos
emparejamiento_de_pares No No
etw_classic_sync_target No No

A menos que se indique lo contrario, los destinos procesan los datos que reciben de forma asincrónica.

Para aprovechar al máximo este artículo, debes hacer lo siguiente:

destino de event_file

El event_file destino escribe la salida de la sesión de eventos de los búferes de memoria en un archivo de disco o en un blob de Azure Storage.

  • Especifica el parámetro filename en la cláusula ADD TARGET. La extensión del nombre de archivo debe ser xel.

  • El nombre de archivo que elija lo usa el sistema como prefijo al que se anexa un valor numérico basado en fecha y hora, seguido de la xel extensión.

  • Opcionalmente, puede especificar el MAX_FILE_SIZE parámetro . Define el tamaño máximo en megabytes (MB) al que el archivo puede crecer antes de crear un nuevo archivo.

  • Opcionalmente, puede especificar la MAX_ROLLOVER_FILES opción para elegir el número máximo de archivos que se conservarán en el sistema de archivos además del archivo actual. El valor predeterminado es UNLIMITED. Cuando MAX_ROLLOVER_FILES se evalúa, si el número de archivos supera la MAX_ROLLOVER_FILES configuración, se eliminan los archivos anteriores.

Importante

En función de los eventos agregados a una sesión, los archivos generados por el event_file destino pueden contener datos confidenciales. Revise cuidadosamente el sistema de archivos y los permisos compartidos en el directorio y en los archivos individuales .xel, incluidos los accesos heredados, para evitar conceder acceso de lectura innecesario. Siga el principio de privilegios mínimos. Para reducir el riesgo de recopilar datos confidenciales accidentalmente, evite sesiones de eventos de larga duración si podrían recopilar datos confidenciales.

Nota:

Azure SQL Database y Azure SQL Managed Instance solo admiten blobs en Azure Storage como valor del parámetro filename. Para obtener un event_file ejemplo de código para Azure SQL Database, SQL Database en Fabric o Azure SQL Managed Instance, consulte Creación de una sesión de eventos con un destino de event_file en Azure Storage.

Cree una sesión de eventos con el destino event_file en el sistema de archivos local

Para ver un tutorial para crear una sesión de eventos mediante event_file almacenamiento de archivos local, con SSMS o T-SQL, consulte Guía rápida: Eventos extendidos.

Crear una sesión de evento con destino event_file en Azure Storage

Para obtener una descripción detallada de cómo crear una cuenta de almacenamiento en Azure Storage, consulte Creación de una cuenta de almacenamiento. Puede crear una cuenta de almacenamiento mediante Azure Portal, PowerShell, Azure SQL, una plantilla de ARM o una plantilla de Bicep. Use una cuenta que:

  • Es una Standard general-purpose v2 cuenta.
  • Usa el Hotnivel de acceso de blob.
  • Si usa SQL Server en máquina virtual de Azure (máquina virtual de Azure), la cuenta de almacenamiento debe estar en la misma región de Azure que la máquina virtual de Azure.
  • No tiene habilitado el espacio de nombres jerárquico .

A continuación, cree un contenedor en esta cuenta de almacenamiento mediante Azure Portal. También puede crear un contenedor mediante PowerShell o mediante la CLI de Azure.

Anote los nombres de la cuenta de almacenamiento y el contenedor que creó. Los usará en los pasos siguientes.

Para leer y escribir datos de eventos, el motor de base de datos requiere acceso específico. Conceda este acceso de forma diferente en función de su elección del tipo de autenticación: identidad administrada o autenticación basada en secretos con un token de firma de acceso compartido (SAS).

Para autenticarse en Azure Storage, el motor de base de datos requiere una credencial con ámbito de servidor o una credencial con ámbito de base de datos, que le indica qué tipo de autenticación usar y proporciona un secreto para la autenticación basada en secretos. La creación de esta credencial requiere el CONTROL permiso de base de datos.

Para SQL Server y Azure SQL Managed Instance, este permiso es necesario en la master base de datos. De forma predeterminada, el permiso lo mantienen los miembros del db_owner rol de base de datos en mastery los miembros del sysadmin rol de servidor en la instancia. Para Azure SQL Database y SQL Database en Fabric, este permiso lo mantiene el propietario de la base de datos (dbo), por los miembros del db_owner rol de base de datos y por el administrador del servidor lógico.

Una vez creada una credencial, los pasos restantes para crear una sesión de eventos no requieren el CONTROL permiso. Consulte Permisos para obtener los permisos específicos necesarios.

Concesión de acceso mediante la identidad administrada

Si usa la identidad administrada con la autenticación de Microsoft Entra, asigne el rol RBAC colaborador de datos de Storage Blob para el contenedor a la identidad administrada usada por el motor de base de datos. Para obtener más información, consulte lo siguiente en función de la plataforma SQL:

Una vez que se haya implementado la asignación de roles de RBAC, siga estos pasos:

  1. Cree una credencial mediante T-SQL.

    Antes de ejecutar el siguiente lote de T-SQL, realice el siguiente cambio:

    • En las tres apariciones de https://<storage-account-name>.blob.core.windows.net/<container-name>, reemplace <storage-account-name> por el nombre de la cuenta de almacenamiento y reemplace por <container-name> el nombre del contenedor. Asegúrese de que no haya ninguna barra diagonal final al final de la dirección URL.

    Creación de una credencial de ámbito de servidor: (se aplica a SQL Server, Instancia administrada de Azure SQL)

    Con una herramienta de cliente como SSMS, abra una nueva ventana de consulta, conéctese a master la base de datos en la instancia en la que desea crear la sesión de eventos y pegue el siguiente lote de T-SQL.

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* When using managed identity, the credential does not contain a secret */
    CREATE CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
        WITH IDENTITY = 'MANAGED IDENTITY';
    

    Creación de una credencial con ámbito de base de datos: (se aplica a Azure SQL Database, Azure SQL Managed Instance, SQL Database en Fabric)

    Con una herramienta de cliente como SSMS, abra una nueva ventana de consulta, conéctese a la base de datos de usuario donde cree la sesión de eventos y pegue el siguiente lote de T-SQL. Asegúrese de que está conectado a la base de datos de usuario y no a la base de datos master.

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.database_credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP DATABASE SCOPED CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* When using managed identity, the credential does not contain a secret */
    CREATE DATABASE SCOPED CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
        WITH IDENTITY = 'MANAGED IDENTITY';
    
  2. A continuación, siga los pasos para crear una sesión de eventos en SSMS con event_file destino en Azure Storage.

Concesión de acceso mediante un token de firma de acceso compartido (SAS)

Si usa la autenticación basada en secretos, cree un token de firma de acceso compartido (SAS) para el contenedor. Para usar este tipo de autenticación, la opción Permitir el acceso a la clave de la cuenta de almacenamiento debe estar habilitada para la cuenta de almacenamiento. Para obtener más información, consulte Impedir la autorización con clave compartida para una cuenta de Azure Storage.

  1. En Azure Portal, vaya a la cuenta de almacenamiento y al contenedor que creó. Seleccione el contenedor y vaya a Configuración > Tokens de acceso compartido.

    El token de SAS debe cumplir los siguientes requisitos:

    • Permisos establecidos en Read, Write, Delete, List.
    • La hora de inicio y la hora de expiración deben abarcar la duración de la sesión de eventos. El token de SAS que cree solo funciona dentro de este intervalo de tiempo.
    • En el caso de Azure SQL Database, Azure SQL Managed Instance y SQL Database en Fabric, el token de SAS no debe tener restricciones de dirección IP.

    Seleccione el botón Generar token de SAS y dirección URL . El token de SAS se encuentra en el cuadro Token de SAS de Blob. Puede copiarlo para usarlo en el paso siguiente.

    Importante

    El token de SAS proporciona acceso de lectura y escritura a este contenedor. Tratarlo como trataría una contraseña o cualquier otro secreto.

    Captura de pantalla de la pantalla Tokens de acceso compartido para un contenedor de Azure Storage, con un token de SAS generado para un contenedor de ejemplo.

  2. Cree una credencial para almacenar el token de SAS mediante T-SQL.

    Antes de ejecutar el siguiente lote de T-SQL, realice estos cambios:

    • Si crea una credencial de ámbito de servidor y usa la CREATE MASTER KEY instrucción, reemplace <password> por una contraseña segura que proteja la clave maestra. Para obtener más información, vea CREATE MASTER KEY.

    • En las tres apariciones de https://<storage-account-name>.blob.core.windows.net/<container-name>, reemplace <storage-account-name> por el nombre de la cuenta de almacenamiento y reemplace por <container-name> el nombre del contenedor.

    • En la cláusula SECRET, reemplace <sas-token> por el token de SAS que copió en el paso anterior.

    Creación de una credencial de ámbito de servidor: (se aplica a SQL Server, Instancia administrada de Azure SQL)

    Con una herramienta de cliente como SSMS, abra una nueva ventana de consulta, conéctela a la master base de datos en la instancia en la que cree la sesión de eventos y pegue el siguiente lote de T-SQL.

    /* Create a master key to protect the secret of the credential */
    IF NOT EXISTS (SELECT 1
                   FROM sys.symmetric_keys
                   WHERE name = '##MS_DatabaseMasterKey##')
        CREATE MASTER KEY ENCRYPTION BY PASSWORD = '<password>'
    
    /* The name of the credential must match the URL of the blob container. */;
    IF EXISTS (SELECT 1
               FROM sys.credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* The secret is the SAS token for the container. */
    CREATE CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<sas-token>';
    

    Creación de una credencial con ámbito de base de datos: (se aplica a Azure SQL Database, Azure SQL Managed Instance, SQL Database en Fabric)

    Con una herramienta de cliente como SSMS, abra una nueva ventana de consulta, conéctese a la base de datos donde cree la sesión de eventos y pegue el siguiente lote de T-SQL. Asegúrese de que está conectado a la base de datos de usuario y no a la base de datos master.

    /* The name of the credential must match the URL of the blob container. */
    IF EXISTS (SELECT 1
               FROM sys.database_credentials
               WHERE name = 'https://<storage-account-name>.blob.core.windows.net/<container-name>')
        DROP DATABASE SCOPED CREDENTIAL
            [https://<storage-account-name>.blob.core.windows.net/<container-name>];
    
    /* The secret is the SAS token for the container. */
    CREATE DATABASE SCOPED CREDENTIAL
        [https://<storage-account-name>.blob.core.windows.net/<container-name>]
    WITH IDENTITY = 'SHARED ACCESS SIGNATURE',
        SECRET = '<sas-token>';
    
  3. A continuación, siga los pasos de la sección siguiente para crear una sesión de eventos en SSMS con event_file destino en Azure Storage.

Crear una sesión de eventos en SSMS con el destino event_file en Azure Storage

Una vez creada la credencial que proporciona acceso al contenedor de almacenamiento, puede crear la sesión de eventos. A diferencia de la creación de la credencial, la creación de una sesión de eventos no requiere el CONTROL permiso. Una vez creada la credencial, puede crear sesiones de eventos incluso si tiene permisos más restringidos. Consulte Permisos para obtener los permisos específicos necesarios.

Para crear una nueva sesión de eventos en SSMS:

  1. Para SQL Server e Instancia administrada de Azure SQL, expanda el nodo Eventos extendidos en la carpeta Administración . Para Azure SQL Database y SQL Database en Fabric, expanda el nodo Eventos extendidos bajo la base de datos.

  2. Haga clic con el botón derecho en la carpeta Sesiones y seleccione Nueva sesión....

  3. En la página General , escriba un nombre para la sesión, que es example-session para el ejemplo de código siguiente.

  4. En la página Eventos , seleccione uno o varios eventos para agregar a la sesión. Por ejemplo, puede seleccionar el evento sql_batch_starting.

  5. En la página Almacenamiento de datos , seleccione event_file como tipo de destino. Pegue la dirección URL del contenedor de almacenamiento en el cuadro Dirección URL de almacenamiento . Escriba una barra diagonal (/) al final de esta dirección URL, seguida del nombre del archivo (blob). Por ejemplo: https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.

  6. Ahora que la sesión está configurada, puede seleccionar opcionalmente el botón Script para crear un script de T-SQL de la sesión para guardarla más adelante.

  7. Seleccione Aceptar para crear la sesión.

  8. En Explorador de objetos, expanda la carpeta Sesiones para ver la sesión de eventos que creó. De forma predeterminada, la sesión no se inicia cuando se crea. Para iniciar la sesión, haga clic con el botón derecho en el nombre de la sesión y seleccione Iniciar sesión. Para detenerla más adelante, seleccione Detener sesión una vez que se ejecute la sesión.

A medida que se ejecutan lotes de T-SQL, la sesión escribe los sql_batch_starting eventos en el example-session.xel blob del contenedor de almacenamiento.

Nota:

Para SQL Managed Instance, en lugar de pegar la dirección URL del contenedor de almacenamiento en la página Almacenamiento de datos, use el botón Script para crear un script de T-SQL de la sesión. Especifique la dirección URL del contenedor como valor para el filename argumento y ejecute el script para crear la sesión.

Cree una sesión de eventos con destino event_file en Azure Storage usando T-SQL

Este es un ejemplo de CREATE EVENT SESSION con una cláusula ADD TARGET que agrega un destino basado en Azure Storage event_file.

CREATE EVENT SESSION [example-session]
ON SERVER
ADD EVENT sqlserver.sql_batch_starting
ADD TARGET package0.event_file
(
    SET filename = N'https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel'
)
GO

Para usar este ejemplo en Azure SQL Database o SQL Database en Fabric, reemplace ON SERVER por ON DATABASE.

Resolución de problemas de sesiones de eventos con destino event_file en Azure Storage

La lista siguiente contiene errores que pueden producirse al iniciar una sesión de eventos extendidos que usa Azure Storage, con las posibles explicaciones del error.

  • El sistema operativo devolvió el error 5: "Acceso denegado".
    • Si usa la autenticación de identidad administrada:
      • La identidad administrada usada por el motor de base de datos no tiene la asignación de roles de RBAC necesaria. Para obtener más información, consulte Concesión de acceso mediante identidad administrada.
      • El firewall de la cuenta de almacenamiento está habilitado y también se habilita una excepción para permitir que los servicios de Azure de confianza accedan a la cuenta de almacenamiento, pero no se ha agregado una Microsoft.Sql/servers instancia de recurso para el servidor lógico a la lista de instancias de recursos a las que se concede acceso. Para más información, consulte Concesión de acceso desde instancias de recursos de Azure.
      • Si usa un perímetro de seguridad de red con el modo forzado, la base de datos y la cuenta de almacenamiento no están en el mismo perímetro.
    • Si usa la autenticación de token de SAS:
      • El firewall de la cuenta de almacenamiento está habilitado. Esto no se admite para las sesiones de eventos que usan la autenticación de tokens de SAS.
      • El token de SAS no tiene permisos suficientes o ha expirado. Para obtener más información, consulte Concesión de acceso mediante un token de SAS.
      • Si usa un perímetro de seguridad de red con el modo aplicado, las reglas de acceso para permitir la comunicación saliente sin restricciones de la base de datos y la comunicación entrante sin restricciones a la cuenta de almacenamiento no están implementadas.
  • El sistema operativo devolvió el error 86: "La contraseña de red especificada no es correcta".
    • No hay ninguna credencial con ámbito de base de datos (para Azure SQL Database) ni credenciales con ámbito de servidor (para Azure SQL Managed Instance o SQL Server) con el nombre que coincida con la dirección URL del contenedor de blobs. Para obtener más información, consulte los ejemplos para conceder acceso mediante identidad administrada o Conceder acceso mediante un token de SAS.
    • El nombre de la credencial termina con una barra diagonal (/). El nombre de la credencial debe terminar con el nombre del contenedor y no debe incluir la barra diagonal final.
  • El sistema operativo devolvió el error 3: "El sistema no encuentra la ruta de acceso especificada".
    • El contenedor especificado en la dirección URL del contenedor de blobs no existe.
  • El sistema operativo devolvió el error 13: "Los datos no son válidos".
    • Hay una directiva de inmutabilidad en el contenedor de blobs. No se admite el almacenamiento inmutable para las sesiones de eventos.
    • La cuenta de almacenamiento tiene el espacio de nombres jerárquico activado. Las cuentas de almacenamiento con espacio de nombres jerárquico habilitado no se admiten para las sesiones de eventos.

función sys.fn_xe_file_target_read_file()

El destino event_file almacena los datos que recibe en un formato binario que no es legible por el usuario. La sys.fn_xe_file_target_read_file función permite representar el contenido de un xel archivo como un conjunto de filas relacional. Para obtener más información, incluidos los ejemplos de uso, consulte sys.fn_xe_file_target_read_file.

destino ring_buffer

El ring_buffer destino es útil para iniciar rápidamente una sesión de eventos y recopilar datos de eventos solo en memoria. Cuando los eventos usan la memoria disponible en el búfer de anillo, se descartan los eventos anteriores. Al detener la sesión de eventos, también se descarta toda la salida de sesión al ring_buffer destino.

Consumes datos de un destino ring_buffer al convertirlo en XML, como se muestra en el ejemplo siguiente. Durante esta conversión, se omiten los datos que no caben en un documento XML de 4 MB. Por lo tanto, incluso si capturas más eventos en el búfer en anillo mediante valores MAX_MEMORY más grandes (o dejando este parámetro en su valor predeterminado), es posible que no puedas consumirlos todos debido al límite de 4 MB en el tamaño del documento XML, teniendo en cuenta la sobrecarga del marcado XML y las cadenas Unicode.

Sabes que el contenido del búfer en anillo se omite durante la conversión a XML si el atributo truncated del documento XML está establecido en 1, por ejemplo:

<RingBufferTarget truncated="1" processingTime="0" totalEventsProcessed="284" eventCount="284" droppedCount="0" memoryUsed="64139">

Sugerencia

Al agregar un ring_buffer destino, establezca su MAX_MEMORY parámetro en 1024 KB o menos. El uso de valores más grandes podría aumentar innecesariamente el consumo de memoria.

De forma predeterminada, MAX_MEMORY para un ring_buffer objetivo no está limitado en SQL Server y está limitado a 32 MB en Azure SQL Database, Azure SQL Managed Instance y la base de datos SQL en Fabric.

Creación de una sesión de eventos con un destino de ring_buffer

Este es un ejemplo de creación de una sesión de eventos con un ring_buffer destino para recopilar los lock_acquired eventos, lo que limita el número total de eventos en el búfer de anillo a 100. En este ejemplo, el MAX_MEMORY parámetro aparece dos veces: una vez para establecer la ring_buffer memoria de destino en 1024 KB y una vez para establecer la memoria del búfer de sesión de eventos en 2 MB.

Para usar este ejemplo en Azure SQL Database o SQL Database en Fabric, reemplace ON SERVER por ON DATABASE.

CREATE EVENT SESSION ring_buffer_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
ADD TARGET package0.ring_buffer
(
SET MAX_EVENTS_LIMIT = 100,
    MAX_MEMORY = 1024
)
WITH
(
    MAX_MEMORY = 2 MB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);

Para iniciar la sesión de eventos, ejecute la siguiente instrucción:

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

Para ver los datos de eventos recopilados en el búfer de anillo en SSMS, expanda el nodo de sesión y seleccione el package0.ping_buffer objetivo. Los datos se muestran en XML.

Para ver los datos de eventos de un ring_buffer destino en un conjunto de filas relacionales mientras la sesión está activa, use expresiones XQuery para convertir XML a datos relacionales. Por ejemplo:

;WITH
/* An XML document representing memory buffer contents */
RingBuffer AS
(
    SELECT CAST (xst.target_data AS XML) AS TargetData
    FROM sys.dm_xe_session_targets AS xst
         INNER JOIN sys.dm_xe_sessions AS xs
             ON xst.event_session_address = xs.address
    WHERE xs.name = N'ring_buffer_lock_acquired'
),
/* 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;

destino de flujo de eventos

El destino event_stream puede usarse en programas de .NET escritos en lenguajes como C#. Los desarrolladores pueden acceder a un flujo de eventos a través de clases de .NET Framework en el Microsoft.SqlServer.XEvents.Linq espacio de nombres. Este objetivo está presente implícitamente en cualquier sesión de evento. No se puede agregar mediante T-SQL.

Para obtener más información, consulte sys.fn_MSxe_read_event_stream.

En caso de aparecer el error 25726 (The event data stream was disconnected because there were too many outstanding events. To avoid this error either remove events or actions from your session or add a more restrictive predicate filter to your session.) al leer desde el destino event_stream, significa que el flujo de eventos se llenó de datos más rápido de lo que el cliente tardaría en consumirlos. Esto hace que el motor de base de datos se desconecte del flujo de eventos para evitar perjudicar el rendimiento del motor de base de datos.

Destino histogram

El histogram objetivo cuenta el número de ocurrencias de eventos para valores distintos en un campo o en una acción. Para cada valor distinto, se usa un cubo de recuento independiente. El histogram destino procesa los datos que recibe de forma sincrónica.

El SOURCE_TYPE parámetro controla el comportamiento del histogram destino:

  • SOURCE_TYPE = 0: recopila datos para un campo de evento.
  • SOURCE_TYPE = 1: recopila datos de una acción. Este es el valor predeterminado.

El valor predeterminado del SLOTS parámetro es 256. Si asigna otro valor, este se redondea a la siguiente potencia de 2. Por ejemplo, SLOTS = 59 se redondearía hasta 64. El número máximo de ranuras de histograma para un histogram destino es 16 384.

Al usar histogram como destino, puedes ver resultados inesperados. Es posible que algunos eventos no aparezcan en las ranuras esperadas, mientras que otras ranuras podrían mostrar un recuento superior al esperado de eventos. Esto puede ocurrir si se produce una colisión de hash al asignar eventos a ranuras. Aunque esto es poco frecuente, si se produce una colisión hash, se cuenta un evento en una ranura en la que no debería contarse. Por este motivo, se debe tener cuidado al suponer que no se produjo un evento solo porque el recuento en una ranura determinada se muestre como cero.

Por ejemplo, tenga en cuenta el siguiente caso:

  • Configurarás una sesión de eventos extendidos, usando histogram como destino y segmentando eventos por object_id, para recopilar estadísticas de ejecución de procedimientos almacenados.
  • Ejecute el procedimiento almacenado A. A continuación, ejecute el procedimiento almacenado B.

Si la función hash devuelve el mismo valor para los object_id dos procedimientos almacenados, el histograma muestra que se ejecuta A dos veces mientras B no aparece.

Para mitigar este problema cuando el número de valores distintos es relativamente pequeño, establece el número de ranuras de histograma superiores al cuadrado de los valores distintos esperados. Por ejemplo, si el destino histogram tiene establecido SOURCE en el campo de eventos table_name y hay 20 tablas en la base de datos, 20*20 = 400. La siguiente potencia de 2 mayor que 400 es 512, que es el número recomendado de ranuras en este ejemplo.

Cada histogram destino acepta datos de un único origen (un campo de evento o una acción) y contiene solo un histograma. No es posible agregar más de un destino del mismo tipo por sesión de eventos. Tampoco es posible tener más de un tipo de origen por histogram destino. Por lo tanto, se requiere una nueva sesión de eventos para realizar un seguimiento de diferentes acciones o campos de evento en un destino independiente histogram .

Creación de una sesión de eventos con un destino de histograma

Este es un ejemplo de creación de una sesión de eventos con un destino histogram.

Para usar este ejemplo en Azure SQL Database o SQL Database en Fabric, reemplace ON SERVER por ON DATABASE.

CREATE EVENT SESSION histogram_lock_acquired
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    ACTION (sqlos.system_thread_id)
)
ADD TARGET package0.histogram
(
    SET FILTERING_EVENT_NAME = N'sqlserver.lock_acquired',
        SLOTS = 16,
        SOURCE = N'sqlos.system_thread_id',
        SOURCE_TYPE = 1
);

En la ADD TARGET ... (SET ...) cláusula, el parámetro SOURCE_TYPE de destino se establece en 1, lo que significa que el histogram destino realiza un seguimiento de una acción.

La cláusula ADD EVENT ... (ACTION ...) agrega la acción sqlos.system_thread_id al evento. El SOURCE parámetro se establece en sqlos.system_thread_id para usar el identificador de subproceso del sistema recopilado por esta acción como origen de datos para el histogram destino. El destino histogram en este ejemplo cuenta el número de eventos lock_acquired por cada subproceso del sistema que adquiere bloqueos mientras la sesión está activa.

Para iniciar la sesión de eventos, ejecute la siguiente instrucción:

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

Para ver los datos de histograma recopilados en SSMS, expanda el nodo de sesión y seleccione el package0.histogram objetivo. Los datos se muestran en una cuadrícula de dos columnas. Cada fila representa un cubo de valores distintos y un recuento de repeticiones.

Así es como podrían verse los datos capturados por el histogram objetivo en este ejemplo. Los valores de la columna value son valores system_thread_id. Por ejemplo, el subproceso del sistema 6540 adquirió un total de 236 bloqueos.

value   count
-----   -----
 6540     236
 9308      91
 9668      74
10144      49
 5244      44
 2396      28

Este es un ejemplo de lectura de los datos de un histogram destino con T-SQL:

WITH histogram_target
AS (SELECT TRY_CAST (st.target_data AS XML) AS target_data
    FROM sys.dm_xe_sessions AS s
         INNER JOIN sys.dm_xe_session_targets AS st
             ON s.address = st.event_session_address
    WHERE s.name = 'event-session-name-placeholder'),
 histogram
AS (SELECT hb.slot.value('(@count)[1]', 'bigint') AS slot_count,
           hb.slot.value('(value/text())[1]', 'nvarchar(max)') AS slot_value
    FROM histogram_target AS ht
CROSS APPLY ht.target_data.nodes('/HistogramTarget/Slot') AS hb(slot))
SELECT slot_value,
       slot_count
FROM histogram;

Destino event_counter

El destino event_counter cuenta cuántas veces se produce cada evento especificado.

El event_counter destino no tiene parámetros y procesa los datos que recibe de forma sincrónica.

Creación de una sesión de eventos con un destino de event_counter

Este es un ejemplo de creación de una sesión de eventos con un destino event_counter. La sesión cuenta los cuatro checkpoint_begin primeros eventos y, a continuación, deja de contar porque su predicado limita el número de eventos enviados a destinos a cuatro. Puede generar el checkpoint_begin evento para este ejemplo ejecutando el CHECKPOINT comando .

Para usar este ejemplo en Azure SQL Database o SQL Database en Fabric, reemplace ON SERVER por ON DATABASE.

CREATE EVENT SESSION event_counter_checkpoint_begin
ON SERVER
ADD EVENT sqlserver.checkpoint_begin
(
    WHERE package0.counter <= 4
)
ADD TARGET package0.event_counter
WITH
(
    MAX_MEMORY = 4096 KB,
    MAX_DISPATCH_LATENCY = 3 SECONDS
);

Para iniciar la sesión de eventos, ejecute la siguiente instrucción:

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

Para ver los datos recopilados en SSMS, expanda el nodo de sesión y seleccione el package0.event_counter destino. Los datos se muestran en una cuadrícula de tres columnas. Cada fila representa un evento con un recuento de sus apariciones.

Así es como podrían verse los datos capturados por el event_counter destino de este ejemplo después de que ocurran cuatro puntos de control.

package_name   event_name         count
------------   ----------------   -----
sqlserver      checkpoint_begin   4

Destino pair_matching

El destino pair_matching permite detectar eventos de inicio que se producen sin un evento de finalización correspondiente. Por ejemplo, puede encontrar un evento lock_acquired sin un evento lock_released coincidente, lo que podría indicar que una transacción de larga duración está manteniendo bloqueos.

Los eventos extendidos no coinciden automáticamente con los eventos de inicio y finalización. En cambio, se define la lógica de coincidencia en la especificación del objetivo de la instrucción pair_matching. Cuando un evento de inicio y uno de fin coinciden, el destino descarta el par, pero conserva los eventos de inicio que no tienen correspondencia.

Crear una sesión de eventos con un objetivo de emparejamiento

En este ejemplo, se crea una tabla de ejemplo denominada T1, se insertan tres filas y se obtiene el object_id valor de esta tabla. Para simplificar, creamos la tabla en la tempdb base de datos de este ejemplo. Si usa una base de datos diferente, ajuste el nombre de la base de datos en el código de ejemplo de T-SQL siguiente.

CREATE TABLE T1 (id INT PRIMARY KEY);

INSERT INTO T1 (id)
VALUES (1), (2), (3);

SELECT OBJECT_ID('T1') AS object_id;
-- object_id = 1029578706

La siguiente sesión de eventos recopila los eventos, lock_acquired, y lock_released. También tiene dos objetivos. Uno es el event_counter objetivo que indica el número de ocurrencias para cada evento. El otro es el pair_matching destino que define la lógica para emparejar el evento de inicio lock_acquired con el evento final lock_released.

La secuencia de campos delimitados por comas asignados a BEGIN_MATCHING_COLUMNS y END_MATCHING_COLUMNS debe ser la misma. No se permiten pestañas ni nuevas líneas entre los campos mencionados en el valor delimitado por comas, aunque sí se permiten los espacios.

En la definición de la sesión de eventos, se usa un predicado de evento para recopilar solo los eventos de la tempdb base de datos donde el object_id objeto del evento coincide con el identificador de objeto de la tabla T1. Ajuste el predicado en la cláusula WHERE para usar el identificador de objeto de su tabla.

Para usar este ejemplo en Azure SQL Database o SQL Database en Fabric, reemplace ON SERVER por ON DATABASE.

CREATE EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
ADD EVENT sqlserver.lock_acquired
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
),
ADD EVENT sqlserver.lock_released
(
    SET COLLECT_DATABASE_NAME = 1,
        COLLECT_RESOURCE_DESCRIPTION = 1
    ACTION (sqlserver.transaction_id)
    WHERE (database_name = 'tempdb'
           AND object_id = 1029578706)
)
ADD TARGET package0.event_counter,
ADD TARGET package0.pair_matching
(
    SET BEGIN_EVENT = N'sqlserver.lock_acquired',
        BEGIN_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        END_EVENT = N'sqlserver.lock_released',
        END_MATCHING_COLUMNS = N'resource_0, resource_1, resource_2, transaction_id, database_id',
        RESPOND_TO_MEMORY_PRESSURE = 1
)
WITH
(
    MAX_MEMORY = 8192 KB,
    MAX_DISPATCH_LATENCY = 15 SECONDS
);

Para iniciar la sesión de eventos, ejecute la siguiente instrucción:

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

Inicie una transacción que actualice la T1 tabla, pero no la confirme ni la revierta. Esto garantiza que haya bloqueos adquiridos pero no liberados.

BEGIN TRANSACTION;
UPDATE T1
    SET id = id + 1;

Examine la salida de cada destino de la pair_matching_lock_acquired_released sesión de eventos en SSMS.

El event_counter destino tiene la siguiente salida, que muestra que un bloqueo permanece sin liberar. Sin embargo, este destino no muestra ningún detalle de este bloqueo.

package_name   event_name      count
------------   ----------      -----
sqlserver      lock_acquired   4
sqlserver      lock_released   3

El pair_matching destino tiene la siguiente salida, truncada para mayor concisión. Como sugiere el event_counter resultado, efectivamente vemos una fila correspondiente al evento no emparejado lock_acquired, con más detalles sobre el evento.

package_name  event_name    timestamp                     associated_object_id  database_id  database_name
------------  ------------  ---------                     -------------         -----------  -------------
sqlserver    lock_acquired   2025-10-01 20:06:07.1890000  1029578706            2            tempdb

Revierta la transacción.

ROLLBACK;

Si agrega una acción a un evento recopilado por el pair_matching objetivo, también se recopilan los datos de la acción. Por ejemplo, puede incluir el texto T-SQL proporcionado por la sqlserver.sql_text acción con el evento . En este ejemplo, recopilaría la consulta que adquirió el bloqueo.

Destino etw_classic_sync_target

En SQL Server, los Eventos extendidos pueden interoperar con Seguimiento de eventos para Windows (ETW) a fin de supervisar la actividad del sistema. Para más información, vea:

Este destino ETW procesa los datos que recibe de forma sincrónica.