In questo articolo vedremo come utilizzare SP_WhoIsActive in Sql Server per monitorare le attività in esecuzione nell’istanza SQL.
Microsoft ha fornito due stored procedure di sistema denominate “sp_who” e “sp_who2” per recuperare tutti i processi attualmente in esecuzione nell’istanza, ma non dispongono di molte informazioni utili che possono facilitare il processo di monitoraggio e analisi delle prestazioni, inoltre mostrano molte informazioni inutili (processi di sistema).
Per questo motivo, Adam Machanic (MVP di Microsoft dal 2004) ha sviluppato una stored procedure più potente chiamata “sp_whoisactive” per colmare il divario tra le esigenze effettive degli amministratori di database e le procedure attualmente fornite (sp_who e sp_who2).
Nelle sezioni seguenti verranno brevemente illustrate le stored procedure sp_who e sp_who2 e come installare e utilizzare SP_WhoIsActive in Sql Server.
Sommario
sp_Who e sp_Who2
Come accennato in precedenza, Microsoft ha fornito sp_Who e so_Who2 per il monitoraggio delle attività in SQL Server. In questa sezione vedremo i dati restituiti da ogni stored procedure e quali sono le differenze tra di esse.
Come descritto nella documentazione ufficiale, sp_who “fornisce informazioni sugli utenti, le sessioni e i processi correnti in un’istanza del motore di database di Microsoft SQL Server. Le informazioni possono essere filtrate per restituire solo i processi che non sono inattivi, che appartengono a un utente specifico o che appartengono a una sessione specifica.”
sp_who restituisce informazioni quali l’ID del processo di sessione (SPID), l’ID del contesto di esecuzione (ECID), lo stato del processo, l’ID di sessione di blocco, il nome del database, l’account di accesso e il nome host associati a questo processo e il tipo di comando.
sp_Who2 è simile a sp_Who ma non è documentato né supportato, ma restituisce ulteriori informazioni e contatore delle prestazioni dai processi correnti, ad esempio il nome del programma che esegue il comando, I/O disco, tempo CPU, ultimo tempo di esecuzione batch.
Come mostrato nelle schermate precedenti, l’output di queste procedure mostra tutti i processi di sistema e utente in esecuzione che non è sempre necessario e l’utente può filtrare solo utilizzando il nome di accesso o l’ID di sessione, mentre potrebbe essere necessario nascondere i processi di sistema. Inoltre, gli output non contengono informazioni sul comando SQL attualmente in esecuzione, ad esempio il tempo di avvio dell’esecuzione, la durata dell’esecuzione, le informazioni WAIT e altre informazioni.
Scaricare e installare SP_WhoIsActive
Per scaricare la store procedure, è sufficiente aprire la sezione download del sito ufficiale e selezionare l’ultima versione disponibile. E’ anche possibile fare il download dal repository GitHub.
Una volta completato il download, è necessario aprire il file who_is_active.sql utilizzando SQL Server Management Studio ed eseguire lo script.
Utilizzare di SP_WhoIsActive in Sql Server
Dopo aver installato la procedura, se la eseguiamo, possiamo vedere che restituisce solo i processi utente in esecuzione per impostazione predefinita e fornisce le seguenti informazioni per ogni processo:
Column | Descrizione | Visibile in sp_who | Visibile in sp_who2 |
dd hh:mm:ss.mss | Process elapsed time | No | No |
session_id | The process session id | Si | Si |
sql_text | The currently running SQL command | No | No |
login_name | The login name associated with the process | Si | Si |
wait_info | The process wait information (aggregated) | No | Si |
CPU | The CPU time | No | Si |
tempdb_allocations | Number of Tempdb writes done | No | No |
tempdb_current | Number of Tempdb pages currently allocated | No | No |
blocking_session_id | The blocking session Id | Si | Si |
reads | number of reads done | No | Disk IO |
writes | number of writes done | No | Disk IO |
physical reads | number of physical reads done | No | Disk IO |
used_memory | the amount of memory used | No | No |
status | The process status | Si | Si |
open_tran_count | the number of transactions used | No | No |
percent_complete | the query completion percentage | No | No |
host_name | The host machine name | Si | Si |
database_name | The database name where the query is executed | Si | Si |
program_name | The application that executed the query | No | Si |
start_time | The process start time | No | Si |
login_time | The login time | No | No |
request_id | The request Id | Si | Si |
collection_time | The time that this last select was run | No | No |
Come illustrato di seguito, per mostrare i processi di sistema è necessario eseguire il comando seguente:
Exec sp_whoisactive @show_system_spids = 1
È possibile visualizzare ulteriori informazioni da questa procedura passando parametri aggiuntivi, ad esempio @get_additional_info, @get_locks, @get_avg_time e altri parametri.
Una delle cose sorprendenti di questa procedura è che è ben documentato e tutte le informazioni correlate possono essere ottenute eseguendo il seguente comando:
Exec sp_whoisactive @help = 1
Con l’utilizzo del comando help verranno mostrate a video tre sezioni:
- Informazioni generali: dove vengono fornite informazioni generali come la versione, il sito web, l’e-mail del creatore
- Descrizione dei parametri: dove viene fornito un elenco di tutti i parametri disponibili con la loro descrizione
- Descrizione delle colonne di output: un elenco completo di tutte le colonne di output disponibili con le relative descrizioni
Salvataggio dei dati di SP_WhoIsActive
Esistono molti motivi per cui è necessario salvare i risultati di una chiamata SP_WhoIsActive a una tabella.
- Monitoraggio pianificato. Acquisizione dei risultati delle chiamate WhoIsActive a intervalli di 5 o 10 minuti per vedere cosa succede sul server Sql durante il giorno
- Utilizzo come parte di un processo di compilazione
- Utilizzo come parte di un sistema di gestione delle eccezioni che chiama automaticamente WhoIsActive ogni volta che si verifica un errore, per creare uno snapshot dello stato corrente dell’istanza del database
Se è necessario è possibile creare un processo dell’agent SQL che esegue periodicamente sp_whoisactive una procedura all’interno di un comando INSERT, ad esempio:
Insert Into [dbo].[Nome_Tabella] Exec sp_whoisactive
Quindi possiamo fare riferimento ai dati memorizzati in un secondo momento per un’ulteriore analisi.
Conclusione
In questo articolo sono state descritte brevemente le procedure sp_who, sp_who2 ed abbiamo visto come utilizzare sp_whoisactive in Sql Server.