Tengo un trabajo configurado en el Agente SQL Server para ejecutar una consulta de actualización. Quiero que este trabajo se ejecute todas las noches entre la medianoche y las 5 a.m. y quiero que se repita cada 5 minutos durante ese período de tiempo. Pero solo quiero que el trabajo se ejecute realmente si la CPU está inactiva, es decir, la utilización de la CPU está por debajo del 20%. Sé que puedo configurar el cronograma y también puedo configurar el requisito de inactividad de la CPU por separado. ¿Hay alguna manera de configurarlo para que ambos 'horarios' tengan que ser verdaderos para que el trabajo se ejecute?
Gracias
fuente
Configure el Agente SQL a través de la ventana Propiedades avanzadas para la Condición de CPU inactiva . Debería establecer el valor "El uso promedio de la CPU cae por debajo" en 20%, y luego cuánto tiempo debe mantenerse en ese nivel antes de que se ejecute el trabajo.
Después de eso, configure el paso del trabajo para verificar el tiempo asegurándose de que esté dentro de su ventana, si dentro de la ventana emita el comando de actualización.
Ahora, el requisito de cada 5 minutos puede no cumplirse exactamente con esta configuración. No pude encontrar nada en este tipo de programación que indique con qué frecuencia se ejecutaría el trabajo. [por ejemplo, si configura "y permanece por debajo de este nivel" en 30 segundos para la condición de CPU inactiva, ¿ejecuta el trabajo con tanta frecuencia?] Eso requeriría un poco de prueba ya que nunca he usado esta configuración antes. Si tengo la oportunidad, puedo intentar ver qué hace y actualizaré esta respuesta.
fuente
Una forma sería tener tres trabajos. Trabajo uno establecido en un horario que habilita el trabajo dos al comienzo de la ventana. El trabajo dos está configurado para ejecutarse cuando la CPU está inactiva y el tercer trabajo desactiva el trabajo dos al final de la ventana. No creo que sea la única forma de hacerlo, pero definitivamente es la más fácil en mi mente.
fuente
Denis estaba muy cerca. Pero la solución real fue un poco cambiada. Como PowerShell no puede verificar la CPU durante un período de tiempo, solo el uso actual, la verificación de SQL Server tuvo que ser utilizada.
Entonces, mi primer paso del trabajo fue ejecutar un script de PowerShell que verifica si la hora actual del sistema está entre las dos restricciones de tiempo. Si es así, entonces el script de PowerShell no hace nada. El trabajo de SQL Server interpreta esto como un éxito.
Luego, el trabajo pasa al último paso y realiza la consulta de actualización.
Sin embargo, si el tiempo actual está fuera del rango, realizo una
Start-Time -s 600
pausa del script de PowerShell durante 10 minutos (simulando el "requisito de 5 a 10 minutos). Esto es para evitar que el agente del servidor SQL intente constantemente ejecutar este trabajo .Después de 10 minutos, el script de PowerShell arroja un error personalizado. Como tengo
$ErrorActionPreference = "Stop"
al comienzo del script, el script de PowerShell deja de ejecutarse después del error. Este paso es muy importante.Dado que powershell se detuvo y no regresó, el Agente SQL Server interpreta esto como un error y no continuará con el paso que realiza la consulta de Actualización.
PD: Ustedes me llevaron en la dirección correcta. Si tuviera suficiente reputación, los votaría.
Editar: Agregado Powershell Script
fuente