wählt Durchschnitt der Top-3 für jeden spezifischen SQL-Auftrag
SELECT jobs.Job_ID AS JobID ,
jobs.NAME AS JobName ,
act.start_execution_date AS StartExecutionDate ,
AVG(FLOOR(run_duration/100)) AS AvgDurationMin ,
CASE
\t \t --If job average less than 5 minutes then limit is avg+10 minutes
WHEN AVG(FLOOR(run_duration/100)) <= 5
THEN (AVG(FLOOR(run_duration/100))) + 2
\t \t --If job average greater than 5 minutes then limit is avg*limit percentage
ELSE (AVG(FLOOR(run_duration/100))
)
END AS DurationLimit ,
DATEDIFF(MI, act.start_execution_date, GETDATE()) AS [CurrentDuration]
FROM @currently_running_jobs crj
INNER JOIN msdb..sysjobs AS jobs ON crj.job_id = jobs.job_id
INNER JOIN msdb..sysjobactivity AS act ON act.job_id = crj.job_id
AND act.stop_execution_date IS NULL
AND act.start_execution_date IS NOT NULL
INNER JOIN msdb..sysjobhistory AS hist ON hist.job_id = crj.job_id
AND hist.step_id = 0
WHERE crj.job_state = 1 --and jobs.NAME = 'long_running_testing'
GROUP BY jobs.job_ID ,
jobs.NAME ,
act.start_execution_date ,
DATEDIFF(MI, act.start_execution_date, GETDATE())
\t \t \t \t \t HAVING CASE WHEN AVG(FLOOR(run_duration/100)) <= 5
\t \t \t \t \t \t \t THEN (AVG(FLOOR(run_duration/100))) + 2
--THEN (AVG(FLOOR(run_duration/100))) + 1
ELSE (AVG(FLOOR(run_duration/100))
)
END < DATEDIFF(MI, act.start_execution_date, GETDATE())
Kann jemand bitte helfen Sie mir die durchschnittliche run_duration der letzten drei Einträge der Aufgabe, durch job_name partitioniert zu extrahieren?
Das folgende Skript, das ich verwendet habe, um Informationen der letzten drei run_duration partitioniert von job_name, aber es berechnet den Durchschnitt aller run_duration.
Hier brauche ich nur die letzten drei Run_Duration Durchschnittszahl.
SELECT top 1 with ties jobs.Job_ID AS JobID , AVG(FLOOR(run_duration/100%100)),
jobs.NAME AS JobName ,
act.start_execution_date AS StartExecutionDate
from msdb..sysjobs AS jobs
inner join msdb..sysjobactivity AS act ON act.job_id = jobs.job_id
INNER JOIN msdb..sysjobhistory AS hist ON hist.job_id = jobs.job_id AND hist.step_id = 0
GROUP BY jobs.job_ID ,
jobs.NAME
, act.start_execution_date ,hist.run_duration,
DATEDIFF(MI, act.start_execution_date, GETDATE())
order by case when row_number() over (partition by jobs.NAME order by hist.run_duration desc) <= 3 then 0 else 1 end;
Vielen Dank cyndi..and können Sie mir bitte führen, wo i case-Anweisung here..The scenorio i Fall verwenden möchten, wie Fall verwenden können (1) --Wenn Durchschnitt Job weniger als 5 Minuten, dann Limit ist Durchschnitt + 10 Minuten Fall (2) - Wenn Job durchschnittlich größer als 5 Minuten ist dann Limit ist AVG * Limit Prozentsatz. Und bitte finden Sie die T-SQL im Kommentar, die erstellt haben, um Avgerage, duration_limit und current_run_time zu berechnen. Können Sie mir bitte dabei helfen .. – Nathan
Ich habe das Skript oben im Schnipsel (neu) hinzugefügt .. können Sie bitte einen Blick darauf .. es ist wie unten, veröffentlichte vollständige Abfrage in den oben genannten Schnipsel .. CASE \t \t --Wenn Job Durchschnitt weniger als 5 Minuten, dann ist Grenze avg + 10 Minuten WENN AVG (FLOOR (run_duration/100)) <= 5 dANN (AVG (FLOOR (run_duration/100))) + 2 \t \t --Wenn Job durchschnittlich mehr als 5 Minuten, dann ELSE avg * Limit Prozentgrenze (AVG (FLOOR (run_duration/100)) ) END AS DurationLimit, – Nathan
ich hinzugefügt, um die Dauer Begrenzung für die endgültige select-Anweisung in der Antwort . Hilft das? –