SQL警告ストアドプロシージャが長すぎるために実行したとき
-
05-09-2019 - |
質問
私はどんな手続きが1秒以上(単なる例)のために実行したときに私に通知するために、SQL Server 2008のアラートを設定したいと思います。
任意のアイデア?
EDITます:
さて、可能ではないようです。しかし、ちょうど別の方向にあなたを微調整するために、私はコンパイル数、通話やその他のさまざまな統計の数を保持masterデータベースの統計表があることを知っています。私は多分、定期的に何らかの形で、それらを照会し、それを報告してもらえますか?
解決
いいえ、このための通知はありません。 あなたは、トレースを設定し、すべての今して、それをポーリングする必要があります。
他のヒント
私はムラデンPrajdicの正しい答えに追加すると、SQL Serverの中央からkevchadders'答えを改善したいと思います。私は以下の提案する解決策は、(xp_sendmailの呼び出しを介してSQLServerCentralのソリューションで使用されている)の代わりのSQLMailのDBMailを使用しています。基本的に、SQLMailのは、MAPIを使用して、セットアップに硬く、DBMailは、SMTPを使用し、セットアップが簡単です。ここで詳細は 2の違いについて。
私は、SQL 2005で動作するようにSQL Serverの中央の解を得ることができなかったと、以下のソリューションは、SQL 2005の私のインストールでテストされています - 。バージョンに基づいて、メーリングリストへ
まず、あなたは、JOINのプロセスIDにジョブIDを変換あろう、新しいUDFをする必要があります:
CREATE FUNCTION dbo.udf_SysJobs_GetProcessid(@job_id uniqueidentifier)
RETURNS VARCHAR(8)
AS
BEGIN
RETURN (substring(left(@job_id,8),7,2) +
substring(left(@job_id,8),5,2) +
substring(left(@job_id,8),3,2) +
substring(left(@job_id,8),1,2))
END
そしてSPROCます:
CREATE PROC sp_check_job_running
@job_name char(50),
@minutes_allowed int,
@person_to_notify varchar(50)
AS
DECLARE @minutes_running int,
@message_text varchar(255)
SELECT @minutes_running = isnull(DATEDIFF(mi, p.last_batch, getdate()), 0)
FROM master..sysprocesses p
JOIN msdb..sysjobs j ON dbo.udf_sysjobs_getprocessid(j.job_id) = substring(p.program_name,32,8)
WHERE j.name = @job_name
IF @minutes_running > @minutes_allowed
BEGIN
SELECT @message_text = ('Job ' + UPPER(SUBSTRING(@job_name,1,LEN(@job_name))) + ' has been running for ' + SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5)))) + ' minutes, which is over the allowed run time of ' + SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5)))) + ' minutes.')
EXEC msdb.dbo.sp_send_dbmail
@recipients = @person_to_notify,
@body = @message_text,
@subject = 'Long-Running Job to Check'
END
このSPROCを簡単SQL Serverエージェントジョブや、必要な任意の他の方法としてスケジュールすることができます。ジョブが実行されていないか、指定されたパラメータの範囲内で実行されている場合にはアクションを実行しません。仕事が長く、指定よりも実行された場合には、電子メールを送信します。
例えばます。
EXEC sp_check_job_running 'JobNameGoesHere', 5, 'admin@mycompany.com'
HT:ます。http://www.sqlserverspecialists。 co.uk/blog/_archives/2008/11/26/3996346.htmlする
(それはおそらくSQL Serverの古いバージョンのため、まだ2008年に関連するかもしれません)。
長時間実行ジョブのアラート手続き http://www.sqlservercentral.com/scripts/Lock+and +接続+管理/ 30144 / の
あなたがそれにアクセスするカント場合は、以下のテキストます。
定期的に実行し、実行するための唯一の短い時間を取るべきであるジョブの場合、DBAは、ジョブが過度の時間のために実行されているとき、知りたいことがあります。この場合、ただの仕事はしないだろう実行されているかどうかをチェックします。それが長期間稼動していないことを確認する能力が必要とされています。 sysprocessesのでプロセスIDにジョブIDと一致して試合を行うために、いくつかの再配置ジョブIDのを必要とします。このスクリプトは、通知するジョブ名、許される最大実行時間、および電子メールアドレスを受け入れるストアドプロシージャを作成します。その時は上にある場合は、警告、その後、ジョブ番号を再文字列にジョブ名を使用すると、ジョブがruningてされた時間の量を決定する(プロセスIDは、番組名の一部であることに基づく)のsysprocessesをチェックしますパラメータ「許容時間」。
CREATE proc sp_check_job_running
@job_name char(50),
@minutes_allowed int,
@person_to_notify varchar(50)
AS
DECLARE @var1 char(1),
@process_id char(8),
@job_id_char char(8),
@minutes_running int,
@message_text varchar(255)
select @job_id_char = substring(CAST(job_id AS char(50)),1,8)
from msdb..sysjobs
where name = @job_name
select @process_id = substring(@job_id_char,7,2) +
substring(@job_id_char,5,2) +
substring(@job_id_char,3,2) +
substring(@job_id_char,1,2)
select @minutes_running = DATEDIFF(minute,last_batch, getdate())
from master..sysprocesses
where program_name LIKE ('%0x' + @process_id +'%')
if @minutes_running > @minutes_allowed
BEGIN
select @message_text = ('Job '
+ UPPER(SUBSTRING(@job_name,1,LEN(@job_name)))
+ ' has been running for '
+ SUBSTRING(CAST(@minutes_running AS char(5)),1,LEN(CAST(@minutes_running AS char(5))))
+ ' minutes, which is over the allowed run time of '
+ SUBSTRING(CAST(@minutes_allowed AS char(5)),1,LEN(CAST(@minutes_allowed AS char(5))))
+ ' minutes.')
EXEC master..xp_sendmail
@recipients = @person_to_notify,
@message = @message_text,
@subject = 'Long-Running Job to Check'
END
-- Typical job step syntax for job to do the checking
execute sp_check_job_running
'JobThatSHouldBeDoneIn5Minutes',
5,
'DBAdmin@mycompany.com'
あなたは定期的にデータベース内の遅いクエリの数をカウントするために Nagiosののような監視ソフトウェアを使用することができます。
私は個人的に優れた PRTG にして次のクエリを使用します。私は私が実行時間で5つの以上のクエリを持つたびに電子メールを送信するように設定より大きい3秒ごと、または最も遅いクエリが10秒よりも長くかかるときます:
SELECT total_elapsed_time / execution_count / 1000000 avg_elapsed_time, execution_count, creation_time, last_execution_time,
SUBSTRING(st.text, (qs.statement_start_offset/2) + 1, ((CASE statement_end_offset WHEN -1 THEN DATALENGTH(st.text) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS statement_text
FROM sys.dm_exec_query_stats AS qs
CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) st
WHERE total_elapsed_time / execution_count / 1000000 >= 3 -- filter queries that takes > 3 seconds
AND CHARINDEX('dm_exec_query_stats', st.text) = 0 -- In case this query is slow, we don't want it in the result set!
ORDER BY total_elapsed_time / execution_count DESC;
免責事項:このクエリは、 https://stackoverflow.com/a/820252/638040 の
今、あなたは、あなたのストアドプロシージャを監視し、その後だけではなく、sys.dm_exec_procedure_stats
のsys.dm_exec_sql_text
を使用したい場合は(も選択からフィールドcreation_time
を削除し、st.text
にSUBSTRINGを微調整)
あなたは遅い実行中のクエリがSQLプロファイラを使用してログインすることができますが、それは具体的には、警告であなたを助けにはなりません。 (私はあなたがファイルまたはデータベーステーブルにログインすることができたとし、「聞く」と警戒を高める他の何かを持っている)。
の場合、あなたはここにSQLプロファイラに精通していない手順は次のとおりです。
あなたはサーバー自体以外の何かにSQLプロファイラを実行する必要があります。
SQLProfilerTSQL_Durationテンプレートを使用して起動します。
フィルタを設定します。期間:1000(milliseonds)に "大なり"
フィルタであなたはログイン、データベースを制限したり、必要に応じて同様のことができます。
あなただけのストアドプロシージャに制限することができますイベント(デフォルトはまた、SQL文が含まれます)で、
は、 SQL Sentryののを見てかかることがあります。それはあなたがのために、より頼む何を行います。