Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment obtenir des informations statistiques sur SQL Server à l'aide des fonctions statistiques du système

Souvent, nous devons collecter des statistiques système concernant l'exécution d'instances SQL Server, telles que le nombre total de connexions tentées à l'instance SQL Server depuis son démarrage, ou le temps passé par SQL Server dans des opérations actives, etc. Microsoft nous a fourni un ensemble distinct de fonctions système pour récupérer les statistiques relatives au système. Aujourd'hui, je vais expliquer ces fonctions statistiques du système avec les cas d'utilisation.

Fonctions statistiques système en SQL

Les fonctions statistiques système sont un type de fonction scalaire renvoyant une valeur unique dans la sortie. Celui-ci fournit des informations statistiques sur le système. Une note essentielle est que toutes les fonctions qui entrent dans cette catégorie ne renverront pas la même sortie lorsque vous les exécuterez. Pour chaque exécution, vous obtenez un résultat différent. C'est pourquoi les fonctions statistiques du système ne sont pas déterministes.

SQL Server dispose de plusieurs fonctions statistiques système intégrées renvoyant les statistiques liées au système. Ci-dessous la liste :

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

Maintenant, explorons-les plus en profondeur.

Comprendre les fonctions système @@CPU_BUSY et @@TIMETICKS

@@CPU_BUSY est crucial lorsque nous devons comprendre combien de temps en millisecondes le processeur a passé à travailler sur les opérations SQL Server. Le résultat de cette fonction est incrémentiel à chaque fois que vous l'exécutez depuis le dernier redémarrage de SQL Server. Cela signifie que pour chaque exécution, nous obtenons une valeur incrémentielle dans la sortie. Voir l'exemple :

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

La sortie :

Il renvoie une valeur numérique unique, ce qui signifie que le processeur a passé 641 millisecondes à exécuter les transactions SQL Server depuis le dernier redémarrage du service SQL Server.

Maintenant, exécutons une simple instruction SELECT. Je vais exécuter à nouveau l'instruction T-SQL ci-dessus pour vérifier si la sortie est incrémentielle.

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

La sortie :

Exécutons SELECT @@CPU_BUSY à nouveau pour voir sa sortie :

Ici, nous pouvons voir une valeur incrémentielle de 653 millisecondes par rapport à la valeur de 641 millisecondes renvoyée dans la première capture d'écran. Par conséquent, nous avons validé que ces fonctions système renvoient des valeurs incrémentielles uniques.

Maintenant, plongeons plus profondément. Nous allons vérifier comment utiliser @@CPU_BUSY dans divers scénarios pour nos besoins.

Comme indiqué ci-dessus, le @@CPU_BUSY la fonction système renvoie la sortie en millisecondes . Si vous souhaitez obtenir sa sortie en microsecondes , vous devez utiliser le @@TIMETICKS fonction lors de l'exécution de l'instruction @@CPU_BUSY T-SQL (voir les commandes ci-dessous).

@@TIMETICKS renvoie le nombre de microsecondes par tick .

Tick ​​est une sorte d'événement de planification qui provoque l'exécution des planificateurs. La durée par tick est la valeur dépendante de l'ordinateur qui peut être récupérée en exécutant l'instruction T-SQL ci-dessous :

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Voici sa sortie :

Nous utiliserons les deux fonctions ensemble pour obtenir leur sortie en microsecondes et secondes :

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

Après avoir exécuté les deux instructions T-SQL, nous pouvons voir les sorties :

Remarque :Si vous avez besoin d'obtenir la sortie @CPU_BUSY dans un type de données flottant , vous pouvez également le faire en exécutant l'ensemble d'instructions ci-dessous :

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

La sortie :

Allez-y et utilisez les fonctions système @@CPU_BUSY &@@TIMETICK selon les besoins de votre entreprise.

Comprendre la fonction système @@IO_BUSY

Comme son nom l'indique, cette fonction système renvoie le temps total en millisecondes que SQL Server a passé à effectuer des opérations d'E/S (opérations Input\Output) depuis le dernier redémarrage de SQL Server. La sortie de cette fonction système est également incrémentielle à chaque fois que vous l'exécutez.

Exécutez l'instruction T-SQL ci-dessous :

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

La sortie dans l'image ci-dessous est de 194 millisecondes.

Nous pouvons également utiliser la fonction système @@TIMETICKS pour obtenir la valeur en microsecondes :

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

Voici le résultat de l'instruction T-SQL ci-dessus :

Si vous souhaitez éviter un débordement arithmétique lors de la conversion de la valeur en microsecondes à l'aide de la fonction système @@TIMETICKS, exécutez la commande ci-dessous pour obtenir sa sortie dans un type de données flottant comme nous l'avons fait précédemment pour la fonction @@CPU_BUSY :

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

Comprendre le fonctionnement du système @@IDLE

Cette fonction système renvoie le temps en millisecondes pour l'état d'inactivité de SQL Server depuis le dernier redémarrage. Exécutez la commande ci-dessous :

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

Voici le résultat :

Vous pouvez également utiliser la fonction GETDATE() avec toutes les fonctions système ci-dessus pour obtenir leur valeur entre l'heure actuelle et l'heure de redémarrage de SQL Server. Si vous souhaitez obtenir cette valeur en microsecondes, utilisez la fonction @@TIMETICKS comme indiqué pour les fonctions @@CPU_BUSY et @@IO_BUSY.

L'instruction T-SQL ci-dessous est très similaire aux exemples précédents. Il renvoie le nombre de secondes et de microsecondes dans un type de données flottant.

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

La sortie :

Comprendre @@PACK_SENT, @@PACK_RECEIVED et @@PACKET_ERRORS

Ces fonctions statistiques système concernent les paquets réseau. Ils sont extrêmement utiles pour analyser les informations sur les paquets réseau.

  • @@PACK_SENT – renvoie le nombre de paquets de sortie écrits sur le réseau par SQL Server depuis le dernier redémarrage.
  • @@PACK_RECEIVED – affiche le nombre de paquets d'entrée lus depuis le réseau par SQL Server depuis le dernier redémarrage.
  • @@PACKET_ERRORS – affiche le nombre d'erreurs de paquets réseau qui se sont produites sur les connexions SQL Server depuis le dernier redémarrage.

Nous pouvons utiliser les instructions T-SQL ci-dessous pour obtenir le nombre de paquets d'entrée et de sortie à lire ou écrire par SQL Server.

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

Les détails de ces paquets se trouvent dans la sortie :

Vous pouvez également exécuter @@PACKET_ERRORS de même pour obtenir le nombre total d'erreurs de paquets :

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Comprendre @@TOTAL_READ, @@TOTAL_WRITE et @@TOTAL_ERRORS

Les fonctions statistiques système liées au disque obtiennent le nombre de lectures sur disque, d'écritures sur disque et d'erreurs d'écriture sur disque effectuées par SQL Server.

  • @@TOTAL_READ – affiche le nombre de lectures de disque par SQL Server depuis le dernier redémarrage.
  • @@TOTAL_WRITE – affiche le nombre d'écritures sur disque par SQL Server depuis le dernier redémarrage.
  • @@TOTAL_ERRORS – affiche le nombre d'erreurs d'écriture sur disque par SQL Server depuis le dernier redémarrage. N'oubliez pas que les erreurs d'écriture non fatales ne sont pas capturées par cette fonction :elles sont gérées par le système lui-même.

J'ai regroupé les 3 fonctions système dans une seule instruction T-SQL pour afficher leur sortie en une seule fois :

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

Ci-dessous, vous pouvez voir le nombre de lectures, d'écritures et d'erreurs d'écriture sur le disque :

Comprendre le fonctionnement du système @@CONNECTIONS

Cette fonction système affiche le nombre total de tentatives de connexion à SQL Server, quel que soit leur succès depuis le dernier redémarrage de SQL Server. Exécutez l'instruction T-SQL ci-dessous :

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

La sortie ci-dessous montre que le nombre total de tentatives de connexion est de 3130 pour cette instance SQL Server. Cela ne signifie pas que toutes les 3130 tentatives ont réussi.

Toutes les fonctions statistiques du système dans une seule instruction T-SQL

Nous pouvons également combiner toutes ces fonctions système dans une seule instruction T-SQL et obtenir une sortie unique pour chaque valeur de statistiques système. J'ai expliqué chacune des fonctions du système séparément car elles pourraient être très utiles pour vos besoins et exigences de travail.

Exécutez le script T-SQL ci-dessous pour obtenir la sortie de toutes les statistiques système décrites en une seule fois :

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

Voici la sortie du script ci-dessus qui affiche toutes les informations relatives aux statistiques dans une seule sortie :

Utilisation d'une procédure stockée pour obtenir des statistiques SQL Server

Il existe également une procédure stockée système Microsoft dédiée qui nous permet d'avoir une vue similaire des statistiques système . Le nom de cette procédure stockée est sp_monitor . Il est excellent pour suivre les utilisations et les valeurs de chaque type de statistiques SQL Server depuis la dernière exécution par la même procédure stockée

Remarque :Vous devez disposer du rôle sysadmin pour exécuter cette procédure stockée.

J'ai exécuté le sp_monitor procédure stockée - voir sa sortie s'afficher sous une forme spécifique comme value(value)-value% ou valeur(valeur). Nous pouvons voir le cpu_busy sortie montrant que 20(19)-0%. Maintenant, vous pourriez réfléchir à la façon dont nous pouvons lire cette sortie. Lisez et comprenez le tableau ci-dessous - il présente l'explication pour les deux types de sortie :

Paramètre système Sortie Interprétation
Cpu_busy 20(19)-0 % Le processeur a été occupé pendant 20 secondes depuis le dernier démarrage de SQL Server\redémarréLe processeur a été occupé pendant 19 secondes depuis la dernière exécution de sp_monitor0 % du temps total depuis la dernière exécution de sp_monitor.
Paquets_reçus 1467(1428) SQL Server a reçu 1467 paquets depuis son dernier démarrage\restartedSQL Server a reçu 1428 paquets depuis la dernière exécution de sp_monitor.

Conclusion

Vous pouvez maintenant voir comment obtenir les statistiques liées au système pour votre instance SQL Server. Les fonctions système et la procédure stockée sp_monitor sera très efficace et pratique. Allez-y et utilisez ces codes T-SQL dans votre travail de développement ou pour des activités d'analyse système.

Merci de partager cet article sur vos réseaux sociaux préférés. Et si vous souhaitez discuter de ces informations et partager vos opinions et astuces, vous êtes les bienvenus dans la section Commentaires.