Guida introduttiva: Eventi estesi
Si applica a:SQL Server
database SQL di Azure Istanza gestita di SQL di Azure
Gli eventi estesi sono una funzionalità leggera di monitoraggio delle prestazioni che consente agli utenti di raccogliere dati per monitorare e risolvere i problemi. Usando gli eventi estesi, è possibile visualizzare i dettagli delle operazioni interne del motore di database rilevanti per il monitoraggio delle prestazioni e la risoluzione dei problemi. Per altre informazioni sugli eventi estesi, vedere Panoramica degli eventi estesi.
Questo articolo ha lo scopo di aiutare gli amministratori, i tecnici e gli sviluppatori SQL che non hanno esperienza con gli eventi estesi e che vogliono iniziare a usarli e visualizzare i dati degli eventi in pochi minuti.
Gli eventi estesi sono noti anche come XEvent e talvolta solo XE.
Dopo aver letto questo articolo, è possibile:
- Vedere come creare una sessione eventi in SQL Server Management Studio (SSMS), con screenshot di esempio
- Correlare screenshot alle istruzioni Transact-SQL equivalenti
- Comprendere in dettaglio i termini e i concetti alla base dell'interfaccia utente di SSMS e delle istruzioni T-SQL XEvents
- Informazioni su come testare la sessione eventi
- Comprendere i risultati della sessione, tra cui:
- Opzioni disponibili per l'archiviazione dei risultati
- Risultati elaborati e non elaborati
- Strumenti per visualizzare i risultati in modi diversi e su scale temporali diverse
- Scopri come cercare e individuare tutti gli eventi disponibili
- Comprendere le relazioni tra le viste di sistema degli eventi estesi
Suggerimento
Per altre informazioni sugli eventi estesi in database SQL di Azure, inclusi gli esempi di codice, vedere Eventi estesi in database SQL.
Prerequisiti iniziali
Per iniziare, è necessario:
- Scaricare SQL Server Management Studio (SSMS). È consigliabile usare una versione recente di SSMS con i miglioramenti e le correzioni più recenti.
- Assicurarsi che l'account disponga dell'autorizzazione del
ALTER ANY EVENT SESSION
server.
Le informazioni dettagliate sulla sicurezza e sulle autorizzazioni relative agli eventi estesi sono disponibili alla fine di questo articolo nell'Appendice.
Eventi estesi in SSMS
SSMS fornisce un'interfaccia utente completamente funzionale per gli eventi estesi. Molti scenari possono essere eseguiti usando questa interfaccia utente, senza dover usare T-SQL o viste a gestione dinamica (DMV).
In questa sezione è possibile visualizzare i passaggi dell'interfaccia utente per creare una sessione eventi estesi e visualizzare i dati segnalati. Dopo aver esaminato i passaggi pratici o esaminati in questo articolo, è possibile leggere i concetti coinvolti nei passaggi per una comprensione più approfondita.
Creare una sessione eventi in SSMS
Quando si crea una sessione eventi estesi, si indica al sistema:
- Eventi a cui si è interessati
- Come si vuole che il sistema riporti i dati all'utente
La dimostrazione apre la finestra di dialogo Nuova sessione , che mostra come usare le quattro pagine denominate:
- Generale
- evento
- Archiviazione dati
- Avanzate
Il testo e gli screenshot di supporto possono essere leggermente diversi nella versione di SSMS, ma devono comunque essere rilevanti per la spiegazione dei concetti di base.
Connessione a un'istanza del motore di database. Gli eventi estesi sono supportati a partire da SQL Server 2014, in database SQL di Azure e Istanza gestita di SQL di Azure.
In Esplora oggetti selezionare Gestione > eventi estesi. In database SQL di Azure, le sessioni di eventi sono con ambito database, quindi l'opzione Eventi estesi è disponibile in ogni database, non in Gestione. Fare clic con il pulsante destro del mouse sulla cartella Sessioni e scegliere Nuova sessione. La finestra di dialogo Nuova sessione è preferibile alla Creazione guidata nuova sessione, anche se le due sono simili.
In alto a sinistra selezionare la pagina Generale . Digitare
YourSession
quindi , o qualsiasi nome desiderato, nella casella di testo Nome sessione. Non selezionare ancora OK , perché è comunque necessario immettere alcuni dettagli in altre pagine.In alto a sinistra selezionare la pagina Eventi .
Nell'area Raccolta eventi , nell'elenco a discesa, scegliere Solo nomi eventi.
- Digitare
sql_statement_
nella casella di testo. In questo modo l'elenco viene filtrato in modo da visualizzare solo gli eventi consql_statement_
nel nome. - Scorrere e selezionare l'evento denominato
sql_statement_completed
. - Selezionare il pulsante
>
freccia destra per spostare l'evento nella casella Eventi selezionati.
- Digitare
Rimanere nella pagina Eventi selezionare il pulsante Configura in alto a destra. Verrà visualizzata la casella Opzioni di configurazione evento per gli eventi selezionati.
Selezionare la scheda Filtro (predicato). Selezionare quindi Seleziona qui per aggiungere una clausola. Questo filtro (noto anche come predicato) viene configurato per acquisire tutte le
SELECT
istruzioni con unaHAVING
clausola .Nell'elenco a discesa Campo scegliere
sqlserver.sql_text
.- Per Operatore scegliere
like_i_sql_unicode_string
. In questo caso,i
nel nome dell'operatore significa nsensitive maiuscole/minuscole. - In Valore digitare
%SELECT%HAVING%
. In questo caso, i segni di percentuale sono caratteri jolly in piedi per qualsiasi stringa di caratteri.
Nota
Nel nome in due parti del campo sqlserver è il nome del pacchetto e sql_text è il nome del campo. L'evento scelto in precedenza, sql_statement_completed, deve essere nello stesso pacchetto del campo scelto.
- Per Operatore scegliere
In alto a sinistra selezionare la pagina Data Archiviazione.
Nell'area Destinazioni selezionare Seleziona qui per aggiungere una destinazione.
- Nell'elenco a discesa Tipo scegliere
event_file
. Ciò significa che i dati dell'evento vengono archiviati in un file che è possibile aprire e visualizzare in un secondo momento. In database SQL di Azure e Istanza gestita di SQL di Azure i dati degli eventi vengono archiviati in BLOB di Archiviazione di Azure.
Nota
A partire da SQL Server 2019, è possibile usare Archiviazione BLOB di Azure in una
event_file
destinazione in SQL Server.- Nell'elenco a discesa Tipo scegliere
Nell'area Proprietà digitare il percorso completo e il nome file nella casella di testo Nome file nel server . È anche possibile usare il pulsante Sfoglia . L'estensione del nome file deve essere
xel
. Nell'esempio è stato usatoC:\Temp\YourSession_Target.xel
In alto a sinistra selezionare la pagina Avanzate . Ridurre la latenza massima di invio a 3 secondi.
Selezionare il pulsante OK nella parte inferiore per creare questa sessione eventi.
Tornare in Esplora oggetti, aprire o aggiornare la cartella Sessioni e visualizzare il nuovo nodo per
YourSession
. La sessione non è ancora stata avviata. La si avvia in un secondo momento.
Modificare una sessione eventi in SSMS
Nel Esplora oggetti SSMS è possibile modificare la sessione eventi facendo clic con il pulsante destro del mouse sul relativo nodo e quindi scegliendo Proprietà. Viene visualizzata la stessa finestra di dialogo a più pagine.
Creare una sessione eventi con T-SQL
Nell'interfaccia utente degli eventi estesi di SSMS è possibile generare uno script T-SQL per creare la sessione eventi come indicato di seguito:
- Fare clic con il pulsante destro del mouse sul nodo della sessione eventi e quindi selezionare Crea sessione come > CREA negli > Appunti.
- Incollare in qualsiasi editor di testo.
Ecco l'istruzione T-SQL generata CREATE EVENT SESSION
per 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 condizionale della sessione eventi
Prima dell'istruzione CREATE EVENT SESSION
, è possibile eseguire un'istruzione DROP EVENT SESSION
in modo condizionale, nel caso in cui esista già una sessione con lo stesso nome. In questo modo viene eliminata la sessione esistente. Senza questo, il tentativo di creare una sessione con lo stesso nome causa un errore.
IF EXISTS (SELECT *
FROM sys.server_event_sessions
WHERE name = 'YourSession')
BEGIN
DROP EVENT SESSION YourSession
ON SERVER;
END
GO
Avviare e arrestare la sessione eventi con T-SQL
Quando si crea una sessione eventi, il valore predefinito è l'avvio non automatico. È possibile avviare o arrestare la sessione eventi in qualsiasi momento usando l'istruzione T-SQL seguente ALTER EVENT SESSION
.
ALTER EVENT SESSION [YourSession]
ON SERVER
STATE = START; -- STOP;
È possibile configurare la sessione eventi per l'avvio automatico all'avvio dell'istanza del motore di database. Vedere la STARTUP STATE = ON
parola chiave in CREATE EVENT SESSION
.
L'interfaccia utente di SSMS offre una casella di controllo corrispondente, Avvia la sessione eventi all'avvio del server, nella pagina Nuovo generale sessione>.
Testare una sessione eventi
Testare la sessione eventi con questi passaggi:
- In Esplora oggetti fare clic con il pulsante destro del mouse sul nodo della sessione eventi e quindi scegliere Avvia sessione.
- Durante la connessione allo stesso server (o allo stesso database in database SQL di Azure) in cui è stata creata la sessione eventi, eseguire l'istruzione seguente
SELECT...HAVING
un paio di volte. È consigliabile modificare il valore nellaHAVING
clausola per ogni esecuzione, passando da 2 a 3. Ciò consente di visualizzare le differenze nei risultati. - Fare clic con il pulsante destro del mouse sul nodo della sessione e scegliere Arresta sessione.
- Leggere la sottosezione successiva su come SELEZIONARE e visualizzare i risultati.
SELECT
c.name,
Count(*) AS [Count-Per-Column-Repeated-Name]
FROM
sys.syscolumns AS c
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;
Per completezza, di seguito è riportato l'output di esempio dell'oggetto precedente SELECT...HAVING
.
/* 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
*/
Visualizzare i dati della sessione eventi come XML
In una finestra di query in SSMS eseguire l'istruzione seguente SELECT
per visualizzare i dati dell'evento acquisiti dalla sessione. Ogni riga rappresenta un'occorrenza di evento. Modifica CAST(... AS xml)
il tipo di dati della colonna da nvarchar a xml. In questo modo è possibile selezionare il valore della colonna per aprirlo in una nuova finestra per facilitare la lettura.
Nota
La event_file
destinazione inserisce sempre una parte numerica nel nome del xel
file. Prima di poter eseguire la query seguente, è necessario copiare il nome completo effettivo del xel
file che include questa parte numerica e incollarlo nell'istruzione SELECT
. Nell'esempio seguente la parte numerica è _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
);
Questa query offre due modi per visualizzare i risultati completi di una determinata riga di evento:
Eseguire il edizione Standard LECT in SSMS e quindi selezionare una cella nella
event_data_XML
colonna.Copiare la stringa XML da una cella nella
event_data
colonna. Incollare in qualsiasi editor di testo come Blocco note e salvare il file con estensionexml
. Aprire quindi il file in un browser o in un editor in grado di visualizzare i dati XML.
Dati dell'evento in XML
Ora verrà esaminata una parte dei risultati, che sono in formato XML. Il codice XML qui viene modificato per brevità. <data name="row_count">
visualizza il valore 6
, che corrisponde alle sei righe dei risultati visualizzate in precedenza. E possiamo vedere l'intera SELECT
affermazione.
<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
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>
Visualizzare i dati della sessione eventi in SSMS
Nell'interfaccia utente di SSMS sono disponibili diverse funzionalità avanzate che è possibile usare per visualizzare i dati acquisiti da una sessione eventi. Per altre informazioni, vedere Visualizzare i dati degli eventi in SQL Server Management Studio.
Si inizia con le opzioni del menu di scelta rapida con l'etichetta Visualizza dati di destinazione e Controlla dati live.
Visualizzare i dati di destinazione
Nella Esplora oggetti SSMS è possibile fare clic con il pulsante destro del mouse sul nodo di destinazione che si trova nel nodo della sessione eventi. Nel menu di scelta rapida selezionare Visualizza dati di destinazione. SSMS visualizza i dati.
La visualizzazione non viene aggiornata man mano che si verificano nuovi eventi in una sessione. È tuttavia possibile selezionare di nuovo Visualizza dati di destinazione.
Guarda i dati in tempo reale
In Esplora oggettidi SSMS è possibile fare clic con il pulsante destro del mouse sul nodo della sessione eventi. Nel menu di scelta rapida selezionare Watch Live Data (Controlla dati in tempo reale). SSMS visualizza i dati in ingresso man mano che continuano ad arrivare in tempo reale.
Termini e concetti negli eventi estesi
La tabella seguente elenca i termini usati per gli eventi estesi e ne descrive i significati.
Termine | Descrizione |
---|---|
event session |
Un costrutto incentrato su uno o più eventi, oltre a elementi di supporto quali azioni e destinazioni. L'istruzione CREATE EVENT SESSION crea ogni sessione evento. È possibile ALTER avviare e arrestare una sessione eventi.Una sessione eventi viene a volte indicata semplicemente come sessione, quando il dal contesto si evince che indica la sessione eventi. Altre informazioni sulle sessioni di eventi sono descritte in: Sessioni di eventi estesi. |
event |
Un'occorrenza specifica del sistema che viene controllata da una sessione eventi attiva. Ad esempio, l'evento sql_statement_completed rappresenta il momento in cui viene completata un'istruzione T-SQL specificata. L'evento può segnalare la durata e altri dati. |
target |
Elemento che riceve i dati di output da un evento acquisito. La destinazione visualizza i dati all'utente. Gli esempi includono la event_file destinazione usata in precedenza in questa guida introduttiva e la ring_buffer destinazione che mantiene gli eventi più recenti in memoria.Qualsiasi tipo di destinazione può essere usato per qualsiasi sessione di eventi. Per informazioni dettagliate, vedere Destinazioni per gli eventi estesi. |
action |
Un campo noto all'evento. I dati del campo vengono inviati alla destinazione. Il campo azione è strettamente correlato al filtro predicato. |
predicate , o filtrare |
Test di dati in un campo evento, usato in modo che solo un subset interessante di occorrenze dell'evento venga inviato alla destinazione. Ad esempio, un filtro può includere solo le sql_statement_completed occorrenze degli eventi in cui l'istruzione T-SQL conteneva la stringa HAVING . |
package |
Un qualificatore del nome associato a ogni elemento in un set di elementi incentrato su un core di eventi. Ad esempio, un pacchetto può avere eventi relativi al testo T-SQL. Un evento può riguardare tutto il T-SQL in un batch. un evento più circoscritto potrebbe riguardare le singole istruzioni T-SQL. Inoltre, per qualsiasi istruzione T-SQL, sono started presenti eventi e completed .Anche i campi appropriati per gli eventi sono inclusi nel pacchetto con gli eventi. La maggior parte delle destinazioni si trova in package0 e viene usata con gli eventi di molti altri pacchetti. |
Scenari di eventi estesi e dettagli di utilizzo
Esistono numerosi scenari per l'uso di eventi estesi per monitorare e risolvere i problemi relativi al motore di database e ai carichi di lavoro di query. Gli articoli seguenti forniscono esempi che usano scenari correlati al blocco:
- Cercare gli oggetti con il maggior numero di blocchi acquisiti
- Individuare le query che mantengono attivi i blocchi
- Questo scenario usa la destinazione pair_matching , in cui la coppia di eventi è
sqlserver.lock_acquire
esqlserver.lock_release
.
- Questo scenario usa la destinazione pair_matching , in cui la coppia di eventi è
Come individuare gli eventi disponibili nei pacchetti
La query seguente restituisce una riga per ogni evento disponibile il cui nome contiene la stringa sql
di tre caratteri . È possibile modificare la LIKE
clausola per cercare nomi di eventi diversi. Il set di risultati identifica anche il pacchetto che contiene l'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;
Nell'esempio di risultato seguente viene illustrata la riga restituita, con pivot qui nel formato .column name = value
I dati provengono dall'evento sql_statement_completed
usato nei passaggi di esempio precedenti. La descrizione dell'oggetto (un evento, in questo esempio) funge da stringa di documentazione.
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
Trovare eventi usando l'interfaccia utente di SSMS
Un'altra opzione per trovare gli eventi in base al nome consiste nell'usare la finestra di dialogo Nuova libreria eventi eventi > sessione > visualizzata in uno screenshot precedente. È possibile digitare un nome di evento parziale e trovare tutti i nomi degli eventi corrispondenti.
Classi di evento di Traccia SQL
Una descrizione dell'uso di eventi estesi con classi di evento e colonne di Traccia SQL è disponibile in: Visualizzare gli eventi estesi equivalenti alle classi di evento di traccia SQL.
Event Tracing for Windows (ETW)
Le descrizioni dell'uso degli eventi estesi con Event Tracing for Windows (ETW) sono disponibili in:
- Destinazione di Event Tracing for Windows
- Monitorare l'attività del sistema mediante gli eventi estesi
Sessioni di eventi di sistema
In SQL Server e Istanza gestita di SQL di Azure vengono create diverse sessioni di eventi di sistema per impostazione predefinita e configurate per l'avvio al momento dell'avvio del motore di database. Analogamente alla maggior parte delle sessioni di eventi, usano una piccola quantità di risorse e non influiscono materialmente sulle prestazioni del carico di lavoro. Microsoft consiglia che queste sessioni rimangano abilitate e in esecuzione. Le sessioni di integrità, in particolare la sessione di system_health , sono spesso utili per il monitoraggio e la risoluzione dei problemi.
È possibile visualizzare queste sessioni di eventi nel Esplora oggetti di SSMS in Sessioni eventi > estesi di gestione>. In SQL Server, ad esempio, queste sessioni di eventi di sistema sono:
AlwaysOn_health
system_health
telemetry_events
Provider PowerShell
È possibile gestire gli eventi estesi usando il provider PowerShell di SQL Server. Per altre informazioni, vedere Utilizzare il provider PowerShell per eventi estesi.
Visualizzazioni di sistema
Le viste di sistema per gli eventi estesi includono:
- Viste del catalogo: per informazioni sulle sessioni di eventi definite da
CREATE EVENT SESSION
. - Viste a gestione dinamica (DMV): per informazioni sulle sessioni di eventi attive (avviate).
edizione Standard LECt e JOIN dalle viste di sistema per gli eventi estesi in SQL Server fornisce informazioni su:
- Come unire le visualizzazioni
- Diverse query utili basate su queste viste
- Correlazione tra:
- Visualizza colonne
- Clausole
CREATE EVENT SESSION
- Interfaccia utente di SSMS
Appendice: Query per trovare i titolari di autorizzazioni degli eventi estesi
Le autorizzazioni indicate in questo articolo sono:
ALTER ANY EVENT SESSION
VIEW SERVER STATE
CONTROL SERVER
L'istruzione seguente SELECT...UNION ALL
restituisce righe che mostrano chi dispone delle autorizzazioni necessarie per la creazione di sessioni eventi e l'esecuzione di query sulle viste del catalogo di sistema per gli eventi estesi.
-- 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 - funzione
L'istruzione seguente SELECT
segnala le autorizzazioni. Si basa sulla funzione predefinita HAS_PERMS_BY_NAME.
Inoltre, se si dispone dell'autorità per rappresentare temporaneamente altri account di accesso, è possibile rimuovere il commento dalle istruzioni EXECUTE AS LOGIN e REVERT
per verificare se altri account di accesso dispongono dell'autorizzazioneALTER ANY EVENT SESSION
.
--EXECUTE AS LOGIN = 'LoginNameHere';
SELECT HAS_PERMS_BY_NAME(NULL, NULL, 'ALTER ANY EVENT SESSION');
--REVERT;
Contenuto correlato
Commenti e suggerimenti
Invia e visualizza il feedback per