SQLServer2005でSQLServerエージェントジョブを使用してストアドプロシージャを実行しています。
この仕事は昨日まで速く走っていた。昨日から、この仕事は2分ではなく1時間以上かかっています。
SSMSでストアドプロシージャを実行しましたが、実行に1分もかかりませんでした。
SQL Serverエージェントジョブとして実行したときに1時間以上かかる理由がわかりませんでしたか?
SQLServer2005でSQLServerエージェントジョブを使用してストアドプロシージャを実行しています。
この仕事は昨日まで速く走っていた。昨日から、この仕事は2分ではなく1時間以上かかっています。
SSMSでストアドプロシージャを実行しましたが、実行に1分もかかりませんでした。
SQL Serverエージェントジョブとして実行したときに1時間以上かかる理由がわかりませんでしたか?
しばらくコメントして、SPがSSMSで実行されたときに同じ入力パラメーターとデータでうまく機能すると仮定した後、最後のヒントを与えることができると思います。
SP内で実行されるアクション(ループまたはカーソル内の大量のデータの挿入/更新/削除など)に応じて、コードの先頭でnocountをオンに設定する必要があります。
set nocount on
そうでない場合、または役に立たない場合は、コメントにすでに記載されている情報を追加してください(たとえば、ジョブと各ジョブステップのすべての設定、ログに記録されたもの、ジョブ履歴にあるもの、SQLerrorlogs、eventlogsなどを確認してください。 ..)。また、「SQL Serverログ」も参照してください。ここで、いくつかの情報を収集できます。また、データベースサーバーのアプリケーション/システムイベントを調べることは常に良い考えです。基本的な概要を取得するには、データベースサーバーを選択し、コンテキストメニューから[アクティビティモニター]を選択してSQLエージェントを検索することにより、SSMSでActivitymonitorを使用できます。
私の最後の試みは、エージェントのSQLトレースを実行することです。この場合、トレースを開始し、SQLAgentサービスを実行するユーザーなどでフィルタリングします。トレースに設定できるオプションはたくさんあるので、グーグルで検索するか、MSDNで検索するか、stackoverflowで別の質問をすることをお勧めします。
SQLエージェントジョブがサーバーのMAXDOP設定を無視し、MAXDOPが1ですべてを実行することに気付きました。クエリウィンドウでストアドプロシージャを実行すると、サーバー設定に従い、4つのプロセスを使用します。SQL Agentを使用する場合、実行するストアドプロシージャは1つのプロセスのみを使用します。
作成した多数のUDFを呼び出すスクリプトでも同様の問題が発生します。UDF自体は通常、SSMSの下で1秒未満で実行されます。同様に、私が生成したレポートをSSMSで実行することは、SSMS(8秒で30dデータ、22秒で365dデータ)で耐えられます。SQLエージェントジョブは通常、他のプロセスやExcelで取得するためにテキストファイルを生成し、最後に余分なデータが必要ないため、SQLエージェントジョブで常にNOCOUNT ONを実行しました。そのため、これは解決策ではありませんでした。
この場合、SQLエージェントでジョブとまったく同じスクリプトを実行すると、時間は指数関数的に増加します。私の8sスクリプトは2分30秒かかり、22秒スクリプトは2時間20分かかります。これは、他のユーザーアクティビティやジョブを使用して正午に実行する場合でも、ユーザーアクティビティを使用せずに時間外に実行する場合でも、ジョブやバックアップを実行する場合でも同じです。私たちのサーバーはアイドル状態で、実行時に8つのコアのうちの1つが使用されています。DBはキャッシュされたRAIDカードを備えたSSDで実行されているのは約10GBであり、32GBのRAMのうち16は空きです。私のSQLはSSMSで効率的に実行されるので、ある種のスレッド制限に達していると確信しています。SQLエージェントのスクリプトの直前にMAXDOPを調べて調整しようとしましたが、うまくいきませんでした。
これは私がスケジュールしたいアクティビティなので、何らかの方法で自動化する必要があります。これらのスクリプトをSQLエージェントジョブのSQLステップとして実行するのに必要な時間を費やすことができましたが、代わりにコマンドラインから実行することにし、SSMSで見られるのと同じパフォーマンスが得られました。
sqlcmd -S SQLSRVRHost -i "C:\My Script Loc With Spaces.sql" -v MyVar="VarValue" >"C:\MyOutputFile.txt"
そこで、sqlcmdから実行されるSQLジョブを使用してバッチスクリプトを作成しました。次に、SQLエージェントジョブからバッチスクリプトを実行するので、同じ管理と制御を引き続き実行できます。SQLエージェントによって実行された単一のバッチスクリプトから1分数秒で完了するのに3時間以上かかった私の4つのSQLジョブ。
これがお役に立てば幸いです...
SSMSでは88秒、SQL Serverエージェントでは30〜45分で実行される大規模なプロシージャがあります。dboを追加しました。すべてのテーブル名にプレフィックスを付けると、SSMSと同じ速度で実行されるようになります。