Hola, chicos,
¡Buenas tardes!

En esta publicación, compartiré con ustedes algo que aprendí esta semana. En la empresa donde trabajo, recientemente se actualizó la versión de RedGate SQL Monitor y como resultado se crearon varias alertas para monitorear instancias.

Uno de estos monitoreos son las consultas de larga duración, que identifican sesiones que han estado ejecutando una instrucción durante más de X minutos. Establecimos este tiempo en 3 minutos, por lo que cualquier sesión que ejecute un comando que exceda este tiempo de ejecución en producción será alertada al equipo de DBA para que lo analice.

El problema es que identificamos que había una sesión que siempre estaba alertada y terminamos disparando esta alerta varias veces, todos los días, generando SPAM en nuestro correo electrónico y haciendo que esta alerta pierda su importancia.

Analizando la alerta podemos ver que esta sesión era desde Database Mail, una utilidad del propio SQL Server, que ejecutó el comando sp_readrequest, tal y como nos muestra la alerta a continuación:

why-a-session-with-sp_readrequest-takes-so-long-to-execute
por qué una sesión con sp_readrequest tarda tanto en ejecutarse

El procedimiento almacenado sp_readrequest es un procedimiento del sistema que básicamente lee solicitudes de mensajes de la cola y devuelve su contenido. Este proceso está activo en la instancia por un tiempo mínimo, determinado por el parámetro “DatabaseMailExeMinimumLifeTime”, cuyo tiempo predeterminado es 600 segundos. En otras palabras, cada vez que se inicia este proceso (y comienza constantemente), se ejecutará durante al menos 600 segundos y, por lo tanto, la alerta siempre se activó.

Para resolver este problema y no tener que cambiar o desactivar mi alerta, simplemente cambio este tiempo mínimo predeterminado:

Usando la interfaz de SQL Server Management Studio
Para cambiar este parámetro a través de SQL Server Management Studio, simplemente acceda a la sección “Administración” > “Correo de base de datos”

why-a-session-with-sp_readrequest-takes-so-long-to-execute-2
por qué-una-sesión-con-sp_readrequest-tarda-tanto-en-ejecutarse-2

Ahora, marque la opción “Ver o cambiar parámetros del sistema” y haga clic en “Siguiente”

why-a-session-with-sp_readrequest-takes-so-long-to-execute-3
por qué-una-sesión-con-sp_readrequest-tarda-tanto-en-ejecutarse-3

En esta pantalla es posible ver el valor actual y definir un nuevo valor para el parámetro “Vida útil mínima del ejecutable de correo de base de datos (segundos)”.

why-a-session-with-sp_readrequest-takes-so-long-to-execute-4
por qué-una-sesión-con-sp_readrequest-tarda-tanto-en-ejecutarse-4

Usando Transact-SQL
Para ver el valor predeterminado del parámetro "" usando comandos Transact-SQL (TSQL), simplemente use la siguiente consulta:

select *
from msdb.dbo.sysmail_configuration
WHERE paramname = 'DatabaseMailExeMinimumLifeTime'

why-a-session-with-sp_readrequest-takes-so-long-to-execute-5
por qué-una-sesión-con-sp_readrequest-tarda-tanto-en-ejecutarse-5

Y si desea cambiar el valor del parámetro, simplemente realice una ACTUALIZACIÓN en la tabla msdb.dbo.sysmail_configuration:

UPDATE msdb.dbo.sysmail_configuration
SET paramvalue = 60 -- 60 segundos
WHERE paramname = 'DatabaseMailExeMinimumLifeTime'

o ejecute el procedimiento almacenado sysmail_configure_sp:

EXECUTE msdb.dbo.sysmail_configure_sp 'DatabaseMailExeMinimumLifeTime', '60'

Un punto importante que se debe tener en cuenta es que este parámetro sirve para limitar el tiempo mínimo que se ejecutará el proceso DatabaseMail para cada conexión.

Con un tiempo mínimo muy alto, el proceso permanecerá activo en la instancia, incluso si no tiene ningún mensaje que entregar.

Si establece un tiempo mínimo muy bajo, el proceso permanecerá activo en la instancia durante menos tiempo, pero también generará más conexiones y desconexiones en la instancia para procesar esta actividad, lo que provocará una pequeña sobrecarga como resultado. Si su instancia siempre tiene muchísimos mensajes de Correo de base de datos para entregar, considere aumentar este tiempo mínimo para reducir la sobrecarga de conexión.

Espero que hayas disfrutado del post y ¡hasta la próxima!
Abrazo.

Sesión de SQL Server ejecutándose de larga duración con el comando sp_readrequest (DatabaseMail) Por qué una sesión con sp_readrequest tarda tanto en ejecutarse Consulta de alerta de Red Gate SQL Monitor de larga duración

Sesión de SQL Server ejecutándose de larga duración con el comando sp_readrequest (DatabaseMail) Por qué una sesión con sp_readrequest tarda tanto en ejecutarse Consulta de alerta de Red Gate SQL Monitor de larga duración