sql >> Base de Datos >  >> RDS >> Sqlserver

Cómo obtener información de estadísticas de SQL Server utilizando funciones estadísticas del sistema

A menudo, necesitamos recopilar estadísticas del sistema con respecto a la ejecución de instancias de SQL Server, como la cantidad total de conexiones intentadas a la instancia de SQL Server desde su inicio, o el tiempo que SQL Server pasó en operaciones activas, etc. Microsoft nos trajo un conjunto separado de funciones del sistema para recuperar las estadísticas relacionadas con el sistema. Hoy, voy a explicar tales funciones estadísticas del sistema con los casos de uso.

Funciones estadísticas del sistema en SQL

Las funciones estadísticas del sistema son un tipo de función escalar que devuelve un único valor en la salida. Este proporciona información estadística sobre el sistema. Una nota esencial es que todas las funciones que pertenecen a esta categoría no devolverán el mismo resultado cuando las ejecute. Para cada ejecución, obtienes un resultado diferente. Es por eso que las funciones estadísticas del sistema no son deterministas.

SQL Server tiene varias funciones estadísticas del sistema integradas que devuelven las estadísticas relacionadas con el sistema. A continuación se muestra la lista:

  • @@CONEXIONES
  • @@PAQUETE_RECIBIDO
  • @@CPU_BUSY
  • @@PACK_ENVIADO
  • @@TIMETICKS
  • @@IDLE
  • @@TOTAL_ERRORS
  • @@IO_OCUPADO
  • @@TOTAL_READ
  • fn_virtualfilestats
  • @@PACKET_ERRORS
  • @@TOTAL_WRITE

Ahora, vamos a explorarlos más a fondo.

Comprensión de las funciones del sistema @@CPU_BUSY y @@TIMETICKS

@@CPU_BUSY es crucial cuando necesitamos entender cuánto tiempo en milisegundos la CPU ha pasado trabajando en las operaciones de SQL Server. El resultado de esta función es incremental cada vez que la ejecuta desde el último reinicio de SQL Server. Significa que para cada ejecución obtenemos un valor incremental en la salida. Ver el ejemplo:

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

La salida:

Devuelve un único valor numérico, lo que significa que la CPU ha dedicado 641 milisegundos a ejecutar las transacciones de SQL Server desde el último reinicio del servicio de SQL Server.

Ahora, ejecutemos una instrucción SELECT simple. Ejecutaré la instrucción T-SQL anterior nuevamente para verificar si la salida es incremental.

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

Ejecutemos SELECT @@CPU_BUSY de nuevo para ver su salida:

Aquí, podemos ver un valor incremental de 653 milisegundos en comparación con el valor de 641 milisegundos devuelto en la primera captura de pantalla. Por lo tanto, hemos validado que estas funciones del sistema devuelvan valores incrementales únicos.

Ahora, profundicemos más. Vamos a ver cómo usar @@CPU_BUSY en varios escenarios para nuestros requerimientos.

Como se indicó anteriormente, el @@CPU_BUSY la función del sistema devuelve la salida en milisegundos . Si desea obtener su salida en microsegundos , debe utilizar @@TIMETICKS mientras ejecuta la instrucción T-SQL @@CPU_BUSY (vea los comandos a continuación).

@@TIMETICKS devuelve el número de microsegundos por tick .

Tick ​​es un tipo de evento de programación que hace que se ejecuten los programadores. La cantidad de tiempo por marca es el valor dependiente de la computadora que se puede obtener ejecutando la siguiente instrucción T-SQL:

--Get @@TIMETICKS output
SELECT @@TIMETICKS

Aquí está su salida:

Usaremos ambas funciones juntas para obtener su salida en microsegundos y segundos:

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

Después de ejecutar ambas declaraciones T-SQL, podemos ver los resultados:

Nota:si tiene un requisito para obtener la salida @CPU_BUSY en un tipo de datos flotante , también puede hacerlo ejecutando el siguiente conjunto de instrucciones:

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

Continúe y use las funciones del sistema @@CPU_BUSY y @@TIMETICK según sus necesidades comerciales.

Comprensión de la función del sistema @@IO_BUSY

Como su nombre indica, esta función del sistema devuelve el tiempo total en milisegundos que SQL Server ha dedicado a realizar operaciones de E/S (operaciones de entrada/salida) desde el último reinicio de SQL Server. La salida de esta función del sistema también es incremental cada vez que la ejecuta.

Ejecute la siguiente instrucción T-SQL:

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

La salida en la imagen de abajo es de 194 milisegundos.

También podemos usar la función del sistema @@TIMETICKS para obtener el valor en microsegundos:

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

Aquí está el resultado de la declaración T-SQL anterior:

Si desea evitar el desbordamiento aritmético al convertir el valor a microsegundos usando la función del sistema @@TIMETICKS, ejecute el siguiente comando para obtener su salida en un tipo de datos flotantes como lo hicimos anteriormente para la función @@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

Comprender la función del sistema @@IDLE

Esta función del sistema devuelve el tiempo en milisegundos del estado inactivo de SQL Server desde el último reinicio. Ejecute el siguiente comando:

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

Aquí está la salida:

También puede usar la función GETDATE() junto con todas las funciones del sistema anteriores para obtener su valor entre la hora actual y la hora en que se reinició SQL Server. Si desea obtener este valor en microsegundos, utilice la función @@TIMETICKS como se muestra para las funciones @@CPU_BUSY y @@IO_BUSY.

La siguiente instrucción T-SQL es muy similar a los ejemplos anteriores. Devuelve el número de segundos y microsegundos en un tipo de datos flotante.

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

Comprensión de @@PACK_SENT, @@PACK_RECEIVED y @@PACKET_ERRORS

Estas funciones estadísticas del sistema se relacionan con paquetes de red. Son extremadamente útiles para analizar la información de los paquetes de red.

  • @@PACK_SENT – devuelve el número de paquetes de salida escritos en la red por SQL Server desde el último reinicio.
  • @@PACK_RECIBIDO – muestra el número de paquetes de entrada leídos de la red por SQL Server desde el último reinicio.
  • @@PACKET_ERRORS – muestra la cantidad de errores de paquetes de red que ocurrieron en las conexiones de SQL Server desde el último reinicio.

Podemos usar las declaraciones T-SQL a continuación para obtener la cantidad de paquetes de entrada y salida para leer o escribir en SQL Server.

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

Los detalles sobre estos paquetes están en la salida:

También puede ejecutar @@PACKET_ERRORS de manera similar para obtener el número total de errores de paquetes:

--Get number of packets Errors
SELECT @@PACKET_ERRORS

Comprender @@TOTAL_READ, @@TOTAL_WRITE y @@TOTAL_ERRORS

Las funciones estadísticas del sistema relacionadas con el disco obtienen el número de lecturas de disco, escrituras de disco y errores de escritura de disco que ha realizado SQL Server.

  • @@TOTAL_READ – muestra el número de lecturas de disco por parte de SQL Server desde el último reinicio.
  • @@TOTAL_WRITE – muestra el número de escrituras en disco por parte de SQL Server desde el último reinicio.
  • @@TOTAL_ERRORS – muestra el número de errores de escritura en disco por parte de SQL Server desde el último reinicio. Recuerde, los errores de escritura no fatales no son capturados por esta función, son manejados por el propio sistema.

Agregué las 3 funciones del sistema en una declaración T-SQL para mostrar el resultado de todas ellas de una sola vez:

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

A continuación puede ver la cantidad de lecturas, escrituras y errores de escritura del disco:

Comprender la función del sistema @@CONNECTIONS

Esta función del sistema muestra el número total de intentos de conexión a SQL Server independientemente de su éxito desde el último reinicio de SQL Server. Ejecute la siguiente instrucción T-SQL:

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

El siguiente resultado muestra que el número total de intentos de conexión es 3130 para esta instancia de SQL Server. No significa que los 3130 intentos fueron exitosos.

Todas las funciones estadísticas del sistema en una declaración T-SQL

También podemos combinar todas estas funciones del sistema en una instrucción T-SQL y obtener una única salida para cada valor de las estadísticas del sistema. He explicado cada una de las funciones del sistema por separado porque pueden ser muy útiles para sus necesidades y requisitos de trabajo.

Ejecute el siguiente script T-SQL para obtener el resultado de todas las estadísticas del sistema descritas de una sola vez:

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

Aquí está el resultado del script anterior que muestra toda la información relacionada con las estadísticas en un solo resultado:

Uso del procedimiento almacenado para obtener estadísticas de SQL Server

También hay un procedimiento almacenado del sistema de Microsoft dedicado que nos permite ver una vista similar de las estadísticas del sistema . El nombre de este procedimiento almacenado es sp_monitor . Es excelente para rastrear los usos y valores de cada tipo de estadísticas de SQL Server desde la última ejecución por el mismo procedimiento almacenado

Nota:debe tener la función de administrador del sistema para ejecutar este procedimiento almacenado.

He ejecutado el sp_monitor procedimiento almacenado:vea que su salida se muestra en una forma específica como value(value)-value% o valor(valor). Podemos ver el cpu_busy salida que muestra como 20(19)-0%. Ahora, podría pensar en cómo podemos leer esta salida. Lea y comprenda la siguiente tabla:presenta la explicación de ambos tipos de salida:

Parámetro del sistema Salida Interpretación
Cpu_ocupada 20(19)-0 % La CPU estuvo ocupada 20 segundos desde que SQL Server se inició por última vez\reinicióLa CPU estuvo ocupada 19 segundos desde que sp_monitor fue la última ejecución0% del tiempo total desde que sp_monitor fue la última ejecución.
Paquetes_recibidos 1467(1428) SQL Server recibió 1467 paquetes desde la última vez que se inició\reinicióSQL Server recibió 1428 paquetes desde que sp_monitor se ejecutó por última vez.

Conclusión

Ahora puede ver cómo obtener las estadísticas relacionadas con el sistema para su instancia de SQL Server. Las funciones del sistema y el procedimiento almacenado sp_monitor será muy eficiente y conveniente. Continúe y use estos códigos T-SQL en su trabajo de desarrollo o para actividades de análisis de sistemas.

Por favor comparte este artículo en tus redes sociales favoritas. Y si desea discutir esta información y compartir sus opiniones y consejos, le invitamos a la sección de Comentarios.