Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come ottenere informazioni sulle statistiche di SQL Server utilizzando le funzioni statistiche di sistema

Spesso è necessario raccogliere statistiche di sistema relative all'esecuzione di istanze di SQL Server, come il numero di connessioni totali tentate all'istanza di SQL Server dall'inizio o il tempo trascorso da SQL Server in operazioni attive, ecc. Microsoft ci ha fornito un set separato di funzioni di sistema per recuperare le statistiche relative al sistema. Oggi spiegherò tali funzioni statistiche di sistema con i casi d'uso.

Funzioni statistiche di sistema in SQL

Le funzioni statistiche di sistema sono un tipo di funzione scalare che restituisce un singolo valore nell'output. Questo fornisce informazioni statistiche sul sistema. Una nota essenziale è che tutte le funzioni che rientrano in questa categoria non restituiranno lo stesso output quando le esegui. Per ogni esecuzione, ottieni un risultato diverso. Ecco perché le funzioni statistiche di sistema non sono deterministiche.

SQL Server dispone di diverse funzioni statistiche di sistema integrate che restituiscono le statistiche relative al sistema. Di seguito l'elenco:

  • @@CONNESSIONI
  • @@PACK_RECEIVED
  • @@CPU_BUSY
  • @@PACK_SENT
  • @@TIMETICKS
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_BUSY
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Ora esploriamoli più a fondo.

Comprensione delle funzioni di sistema @@CPU_BUSY e @@TIMETICKS

@@CPU_BUSY è fondamentale quando dobbiamo capire quanto tempo in millisecondi la CPU ha impiegato per lavorare sulle operazioni di SQL Server. Il risultato di questa funzione è incrementale ogni volta che la si esegue dall'ultimo riavvio di SQL Server. Significa che per ogni corsa otteniamo un valore incrementale nell'output. Vedi l'esempio:

--Execute below T-SQL to get how busy your CPU is
SELECT @@CPU_BUSY

L'uscita:

Restituisce un singolo valore numerico, il che significa che la CPU ha impiegato 641 millisecondi per eseguire le transazioni di SQL Server dall'ultimo riavvio del servizio SQL Server.

Ora eseguiamo una semplice istruzione SELECT. Eseguirò nuovamente l'istruzione T-SQL sopra per verificare se l'output è incrementale.

--Fetch top 1000 rows for a table
SELECT TOP (1000) [BusinessEntityID]
      ,[PersonType]
      ,[NameStyle]
      ,[Title]
      ,[FirstName]
      ,[MiddleName]
      ,[LastName]
      ,[Suffix]
      ,[EmailPromotion]
      ,[AdditionalContactInfo]
      ,[Demographics]
      ,[rowguid]
      ,[ModifiedDate]
  FROM [AdventureWorks2019].[Person].[Person]

L'uscita:

Eseguiamo SELECT @@CPU_BUSY di nuovo per vedere il suo output:

Qui possiamo vedere un valore incrementale di 653 millisecondi rispetto al valore di 641 millisecondi restituito nel primo screenshot. Pertanto, abbiamo verificato che queste funzioni di sistema restituiscano valori incrementali singoli.

Ora, tuffiamoci più a fondo. Verificheremo come utilizzare @@CPU_BUSY in vari scenari per le nostre esigenze.

Come indicato sopra, il @@CPU_BUSY la funzione di sistema restituisce l'output in millisecondi . Se vuoi ottenere il suo output in microsecondi , devi utilizzare @@TIMETICKS durante l'esecuzione dell'istruzione T-SQL @@CPU_BUSY (vedere i comandi seguenti).

@@TIMETICKS restituisce il numero di microsecondi per tick .

Tick ​​è una sorta di evento di pianificazione che provoca l'esecuzione degli scheduler. La quantità di tempo per tick è il valore dipendente dal computer che può essere recuperato eseguendo l'istruzione T-SQL seguente:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Ecco il suo output:

Useremo entrambe le funzioni insieme per ottenere il loro output in microsecondi e secondi:

--Get @@CPU_BUSY output in Microseconds & seconds
SELECT @@CPU_BUSY*@@TIMETICKS As [CPU Busy Microseconds]
Go
SELECT @@CPU_BUSY*@@TIMETICKS/1000000 As [CPU Busy Seconds]
Go 

Dopo aver eseguito entrambe le istruzioni T-SQL, possiamo vedere gli output:

Nota:se hai un requisito per ottenere l'output @CPU_BUSY in un tipo di dati float , puoi anche farlo eseguendo il seguente insieme di istruzioni:

--Get @@CPU_BUSY output in Microseconds & seconds with float data type
SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds], 
@@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds]
Go

L'uscita:

Vai avanti e usa le funzioni di sistema @@CPU_BUSY e @@TIMETICK secondo le tue esigenze aziendali.

Comprensione della funzione di sistema @@IO_BUSY

Come suggerisce il nome, questa funzione di sistema restituisce il tempo totale in millisecondi che SQL Server ha impiegato per eseguire operazioni di I/O (operazioni di Input\Output) dall'ultimo riavvio di SQL Server. Anche l'output di questa funzione di sistema è incrementale ogni volta che la esegui.

Esegui l'istruzione T-SQL seguente:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY

L'output nell'immagine sottostante è di 194 millisecondi.

Possiamo anche usare la funzione di sistema @@TIMETICKS per ottenere il valore in microsecondi:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY*@@TIMETICKS AS [IO Microseconds]
GO
SELECT @@IO_BUSY*@@TIMETICKS/1000000 AS [IO Seconds]

Ecco l'output dell'istruzione T-SQL precedente:

Se si desidera evitare l'overflow aritmetico durante la conversione del valore in microsecondi utilizzando la funzione di sistema @@TIMETICKS, eseguire il comando seguente per ottenere il suo output in un tipo di dati float come abbiamo fatto per la funzione @@CPU_BUSY in precedenza:

--Get total time SQL Server has taken in IO operations since its last restart
SELECT @@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds]
GO
SELECT @@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds]
Go

Comprensione della funzione @@IDLE del sistema

Questa funzione di sistema restituisce il tempo in millisecondi per lo stato di inattività di SQL Server dall'ultimo riavvio. Esegui il comando seguente:

--Get total time SQL Server was idle
SELECT @@IDLE

Ecco l'output:

È inoltre possibile utilizzare la funzione GETDATE() insieme a tutte le funzioni di sistema precedenti per ottenere il loro valore tra l'ora corrente e l'ora in cui SQL Server è stato riavviato. Se vuoi ottenere questo valore in microsecondi, usa la funzione @@TIMETICKS come mostrato per le funzioni @@CPU_BUSY e @@IO_BUSY.

L'istruzione T-SQL seguente è molto simile agli esempi precedenti. Restituisce il numero di secondi e microsecondi in un tipo di dati float.

--Get total time SQL Server was idle
SELECT @@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds]
GO
SELECT @@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds]
Go

L'uscita:

Capire @@PACK_SENT, @@PACK_RECEIVED e @@PACKET_ERRORS

Queste funzioni statistiche di sistema si riferiscono ai pacchetti di rete. Sono estremamente utili per analizzare le informazioni sui pacchetti di rete.

  • @@PACK_SENT – restituisce il numero di pacchetti di output scritti nella rete da SQL Server dall'ultimo riavvio.
  • @@PACK_RECEIVED – visualizza il numero di pacchetti di input letti dalla rete da SQL Server dall'ultimo riavvio.
  • @@PACKET_ERRORS – visualizza il numero di errori relativi ai pacchetti di rete che si sono verificati sulle connessioni di SQL Server dall'ultimo riavvio.

Possiamo utilizzare le seguenti istruzioni T-SQL per ottenere il numero di pacchetti di input e output da leggere o scrivere da SQL Server.

--Get the number of packets received or sent
SELECT @@PACK_SENT AS [Packets Sent]
GO
SELECT @@PACK_RECEIVED AS [Packets RECIEVED]
GO

I dettagli su questi pacchetti sono nell'output:

Puoi anche eseguire @@PACKET_ERRORS allo stesso modo per ottenere il numero totale di errori di pacchetto:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Capire @@TOTAL_READ, @@TOTAL_WRITE e @@TOTAL_ERRORS

Le funzioni statistiche di sistema relative al disco ottengono il numero di letture, scritture e errori di scrittura del disco eseguiti da SQL Server.

  • @@TOTAL_READ – visualizza il numero di letture del disco da parte di SQL Server dall'ultimo riavvio.
  • @@TOTAL_WRITE – visualizza il numero di scritture su disco da parte di SQL Server dall'ultimo riavvio.
  • @@TOTAL_ERRORS – visualizza il numero di errori di scrittura del disco da parte di SQL Server dall'ultimo riavvio. Ricorda, gli errori di scrittura non fatali non vengono acquisiti da questa funzione:sono gestiti dal sistema stesso.

Ho bastonato tutte e 3 le funzioni di sistema in un'unica istruzione T-SQL per visualizzare l'output di tutte in un colpo solo:

--Get Disk related statistics
SELECT @@TOTAL_READ AS [Reads], 
@@TOTAL_WRITE AS [Writes], 
@@TOTAL_ERRORS As [Disk Errors]

Di seguito puoi vedere il numero di letture, scritture ed errori di scrittura del disco:

Comprensione della funzione del sistema @@CONNECTIONS

Questa funzione di sistema visualizza il numero totale di tentativi di connessione a SQL Server, indipendentemente dall'esito positivo dell'ultimo riavvio di SQL Server. Esegui l'istruzione T-SQL seguente:

--Get the number of attempted connections
SELECT @@CONNECTIONS AS [Total Connections]

L'output seguente mostra che il numero totale di tentativi di connessione è 3130 per questa istanza di SQL Server. Ciò non significa che tutti i 3130 tentativi siano andati a buon fine.

Tutte le funzioni statistiche di sistema in un'unica istruzione T-SQL

Possiamo anche combinare tutte queste funzioni di sistema in un'unica istruzione T-SQL e ottenere un singolo output per ogni valore delle statistiche di sistema. Ho spiegato ciascuna delle funzioni del sistema separatamente perché potrebbero essere molto utili per le tue esigenze e requisiti di lavoro.

Esegui lo script T-SQL seguente per ottenere l'output di tutte le statistiche di sistema descritte in un colpo solo:

--Get system statistics
SELECT @@CPU_BUSY*CAST (@@TIMETICKS As float) As [CPU Busy Microseconds],
@@CPU_BUSY*CAST (@@TIMETICKS As float)/1000000 As [CPU Busy Seconds],
@@IO_BUSY*CAST (@@TIMETICKS As float) AS [IO Microseconds],
@@IO_BUSY*CAST (@@TIMETICKS As float)/1000000 AS [IO Seconds],
@@IDLE* CAST(@@TIMETICKS AS Float) As [IO Microseconds],
@@IDLE*CAST(@@TIMETICKS AS Float)/1000000 AS [IO Seconds],
@@PACK_SENT AS [Packets Sent],
@@PACK_RECEIVED AS [Packets RECIEVED],
@@TOTAL_READ AS [Reads], 
@@TOTAL_WRITE AS [Writes], 
@@TOTAL_ERRORS As [Disk Errors],
@@CONNECTIONS AS [Total Connections]

Ecco l'output dello script precedente che mostra tutte le informazioni relative alle statistiche in un output:

Utilizzo della stored procedure per ottenere le statistiche di SQL Server

C'è anche una procedura memorizzata di sistema Microsoft dedicata che ci consente di vedere una vista simile delle statistiche di sistema . Il nome di questa stored procedure è sp_monitor . È eccellente per tenere traccia degli utilizzi e dei valori di ogni tipo di statistica di SQL Server dall'ultima esecuzione della stessa procedura memorizzata

Nota:per eseguire questa procedura memorizzata è necessario disporre del ruolo di amministratore di sistema.

Ho eseguito sp_monitor stored procedure:guarda che il suo out viene visualizzato in una forma specifica come value(value)-value% o valore(valore). Possiamo vedere la cpu_busy output mostrato come 20(19)-0%. Ora potresti pensare a come possiamo leggere questo output. Leggi e comprendi la tabella seguente:presenta la spiegazione per entrambi i tipi di output:

Parametro di sistema Uscita Interpretazione
Cpu_occupata 20(19)-0% La CPU è stata occupata per 20 secondi dall'ultimo avvio di SQL Server\restartedCPU è stata occupata per 19 secondi poiché sp_monitor è stata l'ultima esecuzione0% del tempo totale dall'ultima esecuzione di sp_monitor.
Pacchetti_ricevuti 1467(1428) SQL Server ha ricevuto 1467 pacchetti dall'ultimo avvio\riavviatoSQL Server ha ricevuto 1428 pacchetti dall'ultima esecuzione di sp_monitor.

Conclusione

Ora puoi vedere come ottenere le statistiche relative al sistema per la tua istanza di SQL Server. Le funzioni di sistema e la procedura memorizzata sp_monitor sarà molto efficiente e conveniente. Vai avanti e usa questi codici T-SQL nel tuo lavoro di sviluppo o per attività di analisi del sistema.

Condividi questo articolo sui tuoi social network preferiti. E se vuoi discutere di queste informazioni e condividere le tue opinioni e suggerimenti, sei il benvenuto nella sezione Commenti.