Condividi tramite


Destinazioni di Extended Events

Si applica a:SQL ServerAzure SQL DatabaseAzure SQL Istanza gestitaDatabase SQL in Microsoft Fabric

Questo articolo spiega quando e come usare le destinazioni per gli Eventi estesi. Per ogni destinazione, l'articolo descrive:

  • Capacità di raccogliere e segnalare i dati degli eventi
  • Esempi di sessioni di eventi che usano il target

La tabella seguente descrive la disponibilità di ogni tipo di destinazione in piattaforme SQL diverse.

Tipo di destinazione SQL Server Database SQL di Azure e database SQL in Fabric Istanza gestita di SQL di Azure
event_file
ring_buffer
event_stream
istogramma
contatore_eventi
pair_matching NO NO
etw_classic_sync_target NO NO

Se non specificato diversamente, le destinazioni elaborano i dati ricevuti in modo asincrono.

Per sfruttare al meglio questo articolo, è necessario:

Destinazione event_file

La event_file destinazione scrive l'output della sessione eventi dai buffer di memoria in un file su disco o in un BLOB in Archiviazione di Azure.

  • Specificare il parametro filename nella clausola ADD TARGET. L'estensione di file deve essere xel.

  • Il nome file scelto viene usato dal sistema come prefisso a cui viene aggiunto un valore numerico basato su data e ora, seguito dall'estensione xel .

  • Facoltativamente, è possibile specificare il MAX_FILE_SIZE parametro . Definisce le dimensioni massime in megabyte (MB) in cui il file può crescere prima della creazione di un nuovo file.

  • Facoltativamente, è possibile specificare l'opzione MAX_ROLLOVER_FILES per scegliere il numero massimo di file da conservare nel file system oltre al file corrente. Il valore predefinito è UNLIMITED. Quando MAX_ROLLOVER_FILES viene valutato, se il numero di file supera l'impostazione MAX_ROLLOVER_FILES , i file meno recenti vengono eliminati.

Importante

A seconda degli eventi aggiunti a una sessione, i file prodotti dalla event_file destinazione potrebbero contenere dati sensibili. Esaminare attentamente il file system e le autorizzazioni di condivisione per la directory e i singoli .xel file, incluso l'accesso ereditato, per evitare di concedere l'accesso in lettura non necessario. Seguire il principio dei privilegi minimi. Per ridurre il rischio di raccogliere dati sensibili inavvertitamente, evitare sessioni di eventi a esecuzione prolungata se potrebbero raccogliere dati sensibili.

Nota

Il database SQL di Azure e l'istanza SQL gestita di Azure supportano solo BLOB in Azure Storage come parametro filename. Per un event_file esempio di codice per Azure SQL Database, SQL Database in Fabric o Istanza gestita di Azure SQL, vedere Creare una sessione di eventi con un target event_file nell'Archiviazione di Azure.

Creare una sessione di eventi con destinazione event_file nel file system locale

Per una procedura dettagliata per la creazione di una sessione di eventi usando l'archiviazione event_file file locali, con SSMS o T-SQL, vedere Guida introduttiva: Eventi estesi.

Creare una sessione eventi con il target event_file nell'archiviazione di Azure

Per una descrizione dettagliata di come creare un account di archiviazione in Archiviazione di Azure, vedere Creare un account di archiviazione. È possibile creare un account di archiviazione usando Azure Portal, PowerShell, Azure SQL, un modello ARM o un Bicep template. Usare un account che:

  • È un Standard general-purpose v2 account.
  • Usa il Hotlivello di accesso al BLOB.
  • Se si usa SQL Server nella macchina virtuale di Azure ,l'account di archiviazione deve trovarsi nella stessa area di Azure della macchina virtuale di Azure.
  • Lo spazio dei nomi gerarchico non è abilitato.

Creare quindi un contenitore in questo account di archiviazione usando il portale di Azure. È anche possibile creare un contenitore usando PowerShell o l'interfaccia della riga di comando di Azure.

Prendere nota dei nomi dell'account di archiviazione e del contenitore creati. È possibile usarli nei passaggi seguenti.

Per leggere e scrivere i dati degli eventi, il motore di database richiede un accesso specifico. L'accesso viene concesso in modo diverso a seconda del tipo di autenticazione scelto: identità gestita o autenticazione basata su segreto con un token di firma di accesso condiviso.

Per eseguire l'autenticazione in Azure Storage, il motore di database richiede una credenziale con ambito server o una credenziale con ambito database, che specifica quale tipo di autenticazione utilizzare e fornisce un segreto per l'autenticazione basata su segreto. La creazione di questa credenziale richiede l'autorizzazione del CONTROL database.

Per SQL Server e Istanza gestita di SQL di Azure, questa autorizzazione è necessaria nel master database. Per impostazione predefinita, l'autorizzazione viene detenuta dai membri del ruolo del database in db_owner e dai membri del ruolo del server master nell'istanza sysadmin. Per il database SQL di Azure e il database SQL in Fabric, questa autorizzazione viene mantenuta dal proprietario del database (dbo), dai membri del db_owner ruolo del database e dall'amministratore del server logico.

Dopo aver creato una credenziale, i passaggi rimanenti per creare una sessione eventi non richiedono l'autorizzazione CONTROL . Vedere Autorizzazioni per le autorizzazioni specifiche necessarie.

Concedere l'accesso usando l'identità gestita

Se si utilizza l'identità gestita con l'autenticazione Microsoft Entra, si assegna il ruolo di controllo degli accessi basato sui ruoli Collaboratore dei dati BLOB di archiviazione per il contenitore all'identità gestita utilizzata dal motore di database. Per altre informazioni, vedere quanto segue in base alla piattaforma SQL:

Dopo aver eseguito l'assegnazione del ruolo RBAC, seguire questi passaggi:

  1. Creare credenziali usando T-SQL.

    Prima di eseguire il batch T-SQL seguente, apportare la modifica seguente:

    • In tutte e tre le occorrenze di https://<storage-account-name>.blob.core.windows.net/<container-name>sostituire <storage-account-name> con il nome dell'account di archiviazione e sostituire <container-name> con il nome del contenitore. Assicurarsi che non sia presente alcuna barra finale alla fine dell'URL.

    Creare credenziali a livello di server: (si applica a SQL Server, Istanza gestita di SQL di Azure)

    Usando uno strumento client come SSMS, aprire una nuova finestra di query, connettersi al master database nell'istanza in cui si vuole creare la sessione eventi e incollare il batch T-SQL seguente.

    /* 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';
    

    Creare credenziali con ambito database: (si applica al database SQL di Azure, a Istanza gestita di SQL di Azure, al database SQL di Azure in Fabric)

    Usando uno strumento client come SSMS, aprire una nuova finestra di query, connettersi al database utente in cui si crea la sessione eventi e incollare il batch T-SQL seguente. Assicurarsi di essere connessi al database utente e non al database 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. Seguire quindi la procedura per creare una sessione di eventi in SQL Server Management Studio (SSMS) con come destinazione event_file in Archiviazione Azure.

Concedere l'accesso usando un token di firma di accesso condiviso

Se si usa l'autenticazione basata su segreto, si crea un token di firma di accesso condiviso per il contenitore. Per usare questo tipo di autenticazione, è necessario abilitare l'opzione Consenti l'accesso alla chiave dell'account di archiviazione per l'account di archiviazione. Per altre informazioni, vedere Impedire l'autorizzazione con chiave condivisa per un account di archiviazione di Azure.

  1. Nel portale di Azure, naviga all'account di archiviazione e al contenitore che hai creato. Selezionare il contenitore e passare a Impostazioni > Token di accesso condiviso.

    Il token di firma di accesso condiviso deve soddisfare i requisiti seguenti:

    • Autorizzazioni impostate su Read, Write, Delete, List.
    • L'ora di inizio e l'ora di scadenza devono includere la durata della sessione eventi. Il token SAS creato funziona solo entro questo intervallo di tempo.
    • Per il database SQL di Azure, Istanza gestita SQL di Azure e il database SQL in Fabric, il token SAS non deve avere restrizioni sugli indirizzi IP.

    Selezionare il pulsante Genera token SAS e URL. Il token SAS si trova nel campo token SAS BLOB. È possibile copiarlo da usare nel passaggio successivo.

    Importante

    Il token SAS fornisce l'accesso in lettura e scrittura a questo contenitore. Considerarla come si tratta di una password o qualsiasi altro segreto.

    Screenshot della schermata Token di accesso condiviso per un contenitore di archiviazione Azure, con un token di accesso condiviso generato per un contenitore di esempio.

  2. Creare una credenziale per archiviare il token SAS usando T-SQL.

    Prima di eseguire il batch T-SQL seguente, apportare queste modifiche:

    • Se si creano credenziali con ambito server e si usa l'istruzione CREATE MASTER KEY , sostituire <password> con una password complessa che protegge la chiave master. Per altre informazioni, vedere CREATE MASTER KEY.

    • In tutte e tre le occorrenze di https://<storage-account-name>.blob.core.windows.net/<container-name>sostituire <storage-account-name> con il nome dell'account di archiviazione e sostituire <container-name> con il nome del contenitore.

    • Nella clausola SECRET, sostituire <sas-token> con il token SAS che hai copiato nel passaggio precedente.

    Creare credenziali a livello di server: (si applica a SQL Server, Istanza gestita di SQL di Azure)

    Usando uno strumento client come SSMS, aprire una nuova finestra di query, connetterla al master database nell'istanza in cui si crea la sessione eventi e incollare il batch T-SQL seguente.

    /* 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>';
    

    Creare credenziali con ambito database: (si applica al database SQL di Azure, a Istanza gestita di SQL di Azure, al database SQL di Azure in Fabric)

    Usando uno strumento client come SSMS, aprire una nuova finestra di query, connettersi al database in cui si crea la sessione eventi e incollare il batch T-SQL seguente. Assicurarsi di essere connessi al database utente e non al database 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. Seguire quindi la procedura descritta nella sezione successiva per creare una sessione eventi in SSMS con destinazione event_file nell'archiviazione di Azure.

Creare una sessione evento in SSMS con event_file come destinazione nell'Archiviazione di Azure

Dopo aver creato le credenziali che forniscono l'accesso al contenitore di archiviazione, è possibile creare la sessione eventi. A differenza della creazione delle credenziali, la creazione di una sessione eventi non richiede l'autorizzazione CONTROL . Dopo aver creato le credenziali, è possibile creare sessioni di eventi anche se si dispone di autorizzazioni più limitate. Vedere Autorizzazioni per le autorizzazioni specifiche necessarie.

Per creare una nuova sessione eventi in SSMS:

  1. Per SQL Server e Istanza gestita di SQL di Azure, espandere il nodo Eventi estesi nella cartella Gestione . Per il database SQL di Azure e il database SQL in Fabric, espandere il nodo Eventi Estesi sotto il database.

  2. Fare clic con il pulsante destro del mouse sulla cartella Sessioni e scegliere Nuova sessione.

  3. Nella pagina Generale immettere un nome per la sessione, che è example-session per l'esempio di codice seguente.

  4. Nella pagina Eventi selezionare uno o più eventi da aggiungere alla sessione. Ad esempio, è possibile selezionare l'evento sql_batch_starting .

  5. Nella pagina Archiviazione dati selezionare event_file come tipo di destinazione. Incollare l'URL del contenitore di archiviazione nella casella URL di archiviazione . Digitare una barra (/) alla fine di questo URL, seguita dal nome del file (BLOB). Ad esempio: https://<storage-account-name>.blob.core.windows.net/<container-name>/example-session.xel.

  6. Ora che la sessione è configurata, è possibile selezionare facoltativamente il pulsante Script per creare uno script T-SQL della sessione per salvarlo in un secondo momento.

  7. Selezionare OK per creare la sessione.

  8. In Esplora oggetti espandere la cartella Sessioni per visualizzare la sessione eventi creata. Per impostazione predefinita, la sessione non viene avviata al momento della creazione. Per avviare la sessione, fare clic con il pulsante destro del mouse sul nome della sessione e scegliere Avvia sessione. È possibile arrestarlo in un secondo momento selezionando Arresta sessione dopo l'esecuzione della sessione.

Quando un batch T-SQL viene eseguito, la sessione scrive gli eventi sql_batch_starting nel BLOB example-session.xel nel contenitore di archiviazione.

Nota

Per Istanza gestita di SQL, invece di incollare l'URL del contenitore di archiviazione nella pagina Archiviazione dati, usare il pulsante Script per creare uno script T-SQL della sessione. Specificare l'URL del contenitore come valore per l'argomento filename ed eseguire lo script per creare la sessione.

Creare una sessione evento con il target event_file in Azure Storage in T-SQL

Ecco un esempio di CREATE EVENT SESSION con una clausola ADD TARGET che aggiunge una destinazione basata su Archiviazione di Azure 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

Per usare questo esempio nel database SQL di Azure o nel database SQL di Fabric, sostituire ON SERVER con ON DATABASE.

Risolvere i problemi delle sessioni eventi con il target event_file nell'archiviazione di Azure

L'elenco seguente contiene errori che possono verificarsi durante l'avvio di una sessione eventi estesa che usa Archiviazione di Azure, con le possibili spiegazioni per l'errore.

  • Il sistema operativo ha restituito l'errore 5: 'Accesso negato'.
    • Se si usa l'autenticazione dell'identità gestita:
      • L'identità gestita usata dal motore di database non ha il ruolo RBAC richiesto. Per altre informazioni, vedere Concedere l'accesso usando l'identità gestita.
      • Il firewall dell'account di archiviazione è abilitato e viene abilitata anche un'eccezione per consentire ai servizi di Azure attendibili di accedere all'account di archiviazione, ma non è stata aggiunta un'istanza Microsoft.Sql/servers di risorsa per il server logico all'elenco di istanze di risorse a cui viene concesso l'accesso. Per altre informazioni, vedere Concedere l'accesso dalle istanze di risorse di Azure.
      • Se si usa un perimetro di sicurezza di rete con modalità applicata, il database e l'account di archiviazione non si trovano nello stesso perimetro.
    • Se si usa l'autenticazione con token di firma di accesso condiviso:
      • Il firewall dell'account di archiviazione è abilitato. Questa opzione non è supportata per le sessioni di eventi che usano l'autenticazione con token SAS.
      • Il token di firma di accesso condiviso non dispone di autorizzazioni sufficienti o è scaduto. Per altre informazioni, vedere Concedere l'accesso usando un token di firma di accesso condiviso.
      • Se si usa un perimetro di sicurezza di rete con modalità applicata, le regole di accesso per consentire la comunicazione in uscita senza restrizioni dal database e la comunicazione in ingresso senza restrizioni all'account di archiviazione non sono presenti.
  • Il sistema operativo ha restituito l'errore 86: "La password di rete specificata non è corretta".
    • Non sono presenti credenziali con ambito database (per il database SQL di Azure) o credenziali con ambito server (per Istanza gestita di SQL di Azure o SQL Server) con il nome corrispondente all'URL del contenitore BLOB. Per altre informazioni, vedere gli esempi per Concedere l'accesso usando l'identità gestita o Concedere l'accesso usando un token SAS.
    • Il nome delle credenziali termina con una barra (/). Il nome delle credenziali deve terminare con il nome del contenitore senza includere la barra finale.
  • Il sistema operativo ha restituito l'errore 3: 'Il sistema non riesce a trovare il percorso specificato'.
    • Il contenitore specificato nell'URL del contenitore BLOB non esiste.
  • Il sistema operativo ha restituito l'errore 13: 'I dati non sono validi'.
    • Esiste un criterio di immutabilità nel contenitore BLOB. L'archiviazione non modificabile non è supportata per le sessioni di eventi.
    • L'account di archiviazione ha lo spazio dei nomi gerarchico abilitato. Gli account di archiviazione con spazio dei nomi gerarchico abilitato non sono supportati per le sessioni di eventi.

Funzione sys.fn_xe_file_target_read_file()

La destinazione event_file archivia i dati ricevuti in un formato binario che non è leggibile. La sys.fn_xe_file_target_read_file funzione consente di rappresentare il contenuto di un xel file come set di righe relazionale. Per altre informazioni, inclusi gli esempi di utilizzo, vedere sys.fn_xe_file_target_read_file.

destinazione ring_buffer

La destinazione ring_buffer è utile per avviare rapidamente una sessione dell'evento e raccogliere i dati dell'evento esclusivamente in memoria. Quando la memoria disponibile nel buffer circolare viene usata dagli eventi, gli eventi meno recenti vengono eliminati. Quando si interrompe la sessione degli eventi, viene eliminato anche tutto l'output della sessione nel target ring_buffer.

I dati vengono utilizzati da una destinazione ring_buffer convertendoli in XML, come illustrato nell'esempio seguente. Durante questa conversione, tutti i dati che non rientrano in un documento XML da 4 MB vengono omessi. Pertanto, anche se si acquisiscono più eventi nel buffer circolare utilizzando valori MAX_MEMORY più grandi (o lasciando questo parametro al valore predefinito), potrebbe non essere possibile utilizzarli tutti a causa del limite di 4 MB per le dimensioni del documento XML, considerando il sovraccarico di markup XML e stringhe Unicode.

Si sa che il contenuto del buffer circolare viene omesso durante la conversione in XML se l'attributo truncated nel documento XML è impostato su 1, ad esempio:

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

Suggerimento

Quando si aggiunge una ring_buffer destinazione, impostare il MAX_MEMORY parametro su 1.024 KB o meno. L'utilizzo di valori più grandi potrebbe aumentare inutilmente il consumo di memoria.

Per impostazione predefinita, MAX_MEMORY per una ring_buffer destinazione non è limitato in SQL Server ed è limitato a 32 MB nel database SQL di Azure, nell'Istanza gestita di Azure SQL e nel database SQL di Fabric.

Creare una sessione di eventi con una destinazione ring_buffer

Ecco un esempio di creazione di una sessione eventi con una ring_buffer destinazione per raccogliere gli lock_acquired eventi, limitando il numero totale di eventi nel buffer circolare a 100. In questo esempio il MAX_MEMORY parametro viene visualizzato due volte: una volta per impostare la ring_buffer memoria di destinazione su 1.024 KB e una volta per impostare la memoria del buffer della sessione eventi su 2 MB.

Per usare questo esempio nel database SQL di Azure o nel database SQL di Fabric, sostituire ON SERVER con 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
);

Per avviare la sessione eventi, eseguire l'istruzione seguente:

ALTER EVENT SESSION ring_buffer_lock_acquired
ON SERVER
STATE = START;

Per visualizzare i dati degli eventi raccolti nel buffer ad anello in SSMS, espandere il nodo della sessione e selezionare il package0.ping_buffer target. I dati vengono visualizzati in XML.

Per visualizzare i dati dell'evento da una ring_buffer destinazione in un set di righe relazionale mentre la sessione è attiva, usare espressioni XQuery per convertire XML in dati relazionali. Per esempio:

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

destinazione event_stream

La destinazione event_stream può essere usata nei programmi .NET scritti in linguaggi come C#. Gli sviluppatori possono accedere a un flusso di eventi tramite delle classi del .NET Framework nello spazio dei nomi Microsoft.SqlServer.XEvents.Linq. Questo target è presente in modo implicito in qualsiasi sessione di eventi. Non può essere aggiunto usando T-SQL.

Per altre informazioni, vedere sys.fn_MSxe_read_event_stream.

Se rilevato l'errore 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. durante la lettura della destinazione event_stream indica che il flusso di eventi riempito più velocemente rispetto al client può avere determinato il consumo dei dati. Di conseguenza, il motore di database si è disconnesso dal flusso di eventi per evitare di incidere sulle prestazioni del server.

Destinazione histogram

L'histogram target conta il numero di occorrenze dell'evento per valori distinti in un campo o azione. Per ogni valore distinto viene usato un bucket di conteggio separato. La histogram destinazione elabora i dati ricevuti in modo sincrono.

Il SOURCE_TYPE parametro controlla il comportamento della histogram destinazione:

  • SOURCE_TYPE = 0: raccoglie i dati per un campo evento.
  • SOURCE_TYPE = 1: raccogliere dati per un'azione. Si tratta dell'impostazione predefinita.

Il valore predefinito del SLOTS parametro è 256. Se si assegna un altro valore, il valore viene arrotondato alla successiva potenza di 2. Ad esempio, SLOTS = 59 verrebbe arrotondato fino a 64. Il numero massimo di slot dell'istogramma per una histogram destinazione è 16.384.

Quando si usa histogram come destinazione, potrebbero in alcuni casi essere visualizzati risultati imprevisti. Alcuni eventi potrebbero non apparire negli slot previsti, mentre altri slot potrebbero mostrare un numero di eventi superiore a quello previsto. Ciò può verificarsi se si verifica un conflitto hash quando si assegnano eventi agli slot. Anche se questo è raro, se si verifica una collisione hash, un evento che deve essere conteggiato in uno slot viene conteggiato in un altro. Per questo motivo, è necessario valutare attentamente nel presupporre che un evento non si sia verificato solo perché il conteggio in uno slot specifico è pari a zero.

Come esempio, esaminare lo scenario seguente:

  • Per configurare una sessione di eventi estesi, utilizzando histogram come destinazione e organizzando gli eventi per object_id, per raccogliere statistiche di esecuzione delle stored procedure.
  • Esegui la stored procedure A. Quindi, eseguire la stored procedure B.

Se la funzione hash restituisce lo stesso valore per entrambe le object_id stored procedure, l'istogramma mostra A eseguito due volte mentre B non appare.

Per attenuare questo problema quando il numero di valori distinti è relativamente piccolo, impostare il numero di slot istogrammi superiore al quadrato dei valori distinti previsti. Ad esempio, se la destinazione histogram ha SOURCE impostato sul campo evento table_name e nel database sono presenti 20 tabelle, 20*20 = 400. La potenza successiva di 2 maggiore di 400 è 512, ossia il numero consigliato di slot in questo esempio.

Ogni histogram destinazione accetta dati da una singola origine (un campo evento o un'azione) e contiene un solo istogramma. Non è possibile aggiungere più di una destinazione dello stesso tipo per sessione di eventi. Non è anche possibile avere più di un tipo di origine per histogram destinazione. Pertanto, è necessaria una nuova sessione di eventi per monitorare azioni o campi evento differenti in una destinazione separata histogram.

Creare una sessione di eventi con una destinazione istogramma

Ecco un esempio di creazione di una sessione eventi con una destinazione histogram.

Per usare questo esempio nel database SQL di Azure o nel database SQL di Fabric, sostituire ON SERVER con 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
);

ADD TARGET ... (SET ...) Nella clausola il parametro SOURCE_TYPE di destinazione è impostato su 1, il che significa che la histogram destinazione tiene traccia di un'azione.

La ADD EVENT ... (ACTION ...) clausola aggiunge l'azione sqlos.system_thread_id all'evento . Il SOURCE parametro è impostato su sqlos.system_thread_id per usare l'ID thread di sistema raccolto da questa azione come origine dei dati per la histogram destinazione. La histogram destinazione in questo esempio conta il numero di eventi per ogni thread di lock_acquired sistema che acquisisce lock mentre la sessione è attiva.

Per avviare la sessione eventi, eseguire l'istruzione seguente:

ALTER EVENT SESSION histogram_lock_acquired
ON SERVER
STATE = START;

Per visualizzare i dati dell'istogramma raccolti in SSMS, espandere il nodo della sessione e selezionare il target package0.histogram. I dati vengono visualizzati in una griglia a due colonne. Ogni riga rappresenta un bucket di valori distinti e un conteggio delle occorrenze.

Ecco come potrebbero apparire i dati acquisiti dal histogram bersaglio in questo esempio. I valori nella colonna value sono valori system_thread_id. Ad esempio, un totale di 236 lock è stato acquisito dal thread di sistema 6540.

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

Ecco un esempio di lettura dei dati da una histogram destinazione 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;

Destinazione event_counter

La destinazione event_counter calcola quante volte si verifica ogni evento specificato.

La event_counter destinazione non ha parametri ed elabora i dati ricevuti in modo sincrono.

Creare una sessione di evento con un obiettivo event_counter

Ecco un esempio di creazione di una sessione eventi con una destinazione event_counter. La sessione conta i primi quattro checkpoint_begin eventi e quindi interrompe il conteggio perché il predicato limita il numero di eventi inviati alle destinazioni a quattro. È possibile generare l'evento checkpoint_begin per questo esempio eseguendo il CHECKPOINT comando .

Per usare questo esempio nel database SQL di Azure o nel database SQL di Fabric, sostituire ON SERVER con 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
);

Per avviare la sessione eventi, eseguire l'istruzione seguente:

ALTER EVENT SESSION event_counter_checkpoint_begin
ON SERVER
STATE = START;

Per visualizzare i dati raccolti in SSMS, espandere il nodo della sessione e selezionare il target package0.event_counter. I dati vengono visualizzati in una griglia a tre colonne. Ogni riga rappresenta un evento con un conteggio delle relative occorrenze.

Ecco come potrebbero apparire i dati rilevati dalla destinazione event_counter in questo esempio dopo quattro checkpoint.

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

Destinazione pair_matching

La destinazione pair_matching consente di individuare gli eventi iniziali che si verificano senza un evento finale corrispondente. Ad esempio, è possibile trovare un evento lock_acquired senza un corrispondente evento lock_released, che potrebbe indicare che una transazione a esecuzione prolungata mantiene blocchi.

Gli eventi estesi non corrispondono automaticamente agli eventi di inizio e fine. Anziché, definisci la logica corrispondente nella specifica di destinazione nell'istruzione pair_matching. Quando un evento di inizio e di fine vengono accoppiati, il sistema elimina la coppia, ma conserva gli eventi di inizio non accoppiati.

Creare una sessione evento con un obiettivo di abbinamento coppie

Per questo esempio viene creata una tabella di esempio denominata T1, si inseriscono tre righe e si ottiene il object_id valore per questa tabella. Per semplicità, in questo esempio la tabella viene creata nel database tempdb. Se si usa un database diverso, modificare il nome del database nel codice di esempio T-SQL seguente.

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 sessione evento seguente raccoglie due eventi, lock_acquired e lock_released. Ha anche due obiettivi. Una è la event_counter destinazione che fornisce il numero di occorrenze per ogni evento. L'altra è la pair_matching destinazione che definisce la logica in modo che corrisponda all'evento iniziale lock_acquired e all'evento finale lock_released in coppie.

La sequenza di campi delimitati da virgole assegnati a BEGIN_MATCHING_COLUMNS e END_MATCHING_COLUMNS deve essere la stessa. Tra i campi indicati nel valore delimitato da virgole non sono consentiti caratteri di tabulazione o di nuova riga, ma possono essere usati gli spazi.

Nella definizione della sessione eventi, viene utilizzato un predicato di evento per raccogliere solo quegli eventi nel database tempdb in cui l'elemento object_id nell'evento corrisponde all'ID dell'oggetto della tabella T1. Modificare il predicato nella WHERE clausola per usare l'ID oggetto della tabella.

Per usare questo esempio nel database SQL di Azure o nel database SQL di Fabric, sostituire ON SERVER con 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
);

Per avviare la sessione eventi, eseguire l'istruzione seguente:

ALTER EVENT SESSION pair_matching_lock_acquired_released
ON SERVER
STATE = START;

Avvia una transazione che aggiorna la tabella T1, ma non esegui il commit o esegui il rollback. In questo modo si garantisce che i blocchi siano stati acquisiti ma non rilasciati.

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

Esaminare l'output di ogni destinazione della sessione di eventi pair_matching_lock_acquired_released in SSMS.

La event_counter destinazione ha il seguente output, che indica che un blocco non è stato rilasciato. Tuttavia, questo target non mostra alcun dettaglio di questo blocco.

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

La pair_matching destinazione ha l'output seguente, troncato per motivi di brevità. Come suggerito dall'output event_counter , viene effettivamente visualizzata una riga per l'evento non abbinato lock_acquired , con altri dettagli sull'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

Eseguire il rollback della transazione.

ROLLBACK;

Se si aggiunge un'azione a un evento raccolto dalla pair_matching destinazione, vengono raccolti anche i dati dell'azione. Ad esempio, è possibile includere il testo T-SQL fornito dall'azione sqlserver.sql_text con l'evento . In questo esempio raccoglierebbe la query che ha acquisito il blocco.

Destinazione etw_classic_sync_target

Gli Eventi estesi di SQL Server possono interagire con Event Tracing for Windows (ETW) per monitorare l'attività del sistema. Per altre informazioni, vedi:

Questa destinazione ETW elabora i dati ricevuti in modo sincrono.