SQL Serverで長時間実行されるクエリを監視する最良の方法は何ですか?


10

データベースに対して、かなり長時間実行されるクエリ(インデックスの再構築、大量のデータセットの更新)を実行する必要があります。SQL Server Management Studioでクエリを実行し、1時間ごとにクエリをチェックする方法はありますか?完了したらメールまたはメッセージを送信したいのですが、これに最適なツールがわかりません。

回答:


4

Gaiusの投稿に続く:スクリプトの前でdbを使用して必要なことを実行する.SQLスクリプトを作成できます->スクリプトを呼び出すオペレーティングシステムタイプのSQLエージェントジョブを作成します。

sqlcmd -E -S SERVERNAME -i "c:\ YOURSCRIPT.sql" -o "C:\ YOURSCRIPT_LOG.log"

新しいステップを追加し、msdb.dbo.sp_send_dbmailプロシージャを使用して電子メールを送信します。この機能をカスタマイズして、SQLテーブルからの特定のクエリをメール内に表示し、スクリプトの実行を確認できます。たとえば、再構築インデックスのdbcc showcontigなどです。


1

SQLジョブを使用するオプションはありますか?そこから通知などができます。断続的な通知を取得する限り、ストアドプロシージャ内にコードなどが必要になります。


1

はい、xp_sendmailを使用してください。事前設定メッセージやSQLステートメントの結果を簡単に送信できます。この機能はSQL Server 6.5以降で利用可能ですが、Denaliでは廃止される予定です。これが操作の永続的な部分になる場合は、より「エンタープライズ」なデータベースメールを使用する必要があります。


1

私は常に「EventLog」テーブルにメッセージを書き込みます。大量のデータを処理する場合、データをチャンクで管理し、チャンクごとにステータス更新をEventLogに書き込みます。

長時間実行されているプロセスの進行状況を確認したい場合は、EventLogテーブルをクエリするだけです。

出力例:

-------------------
-私の大きなアップデート-
-------------------
開始日:2011-05-03 10:00:00

処理するレコード:1,000,000
チャンク:200

---チャンク1 ---
MyTableを更新しようとしています
更新されたレコード:5000
残りの記録:995,000
スループット:4210レコード/秒

---チャンク2--
MyTableを更新しようとしています
更新されたレコード:5000
残りの記録:990,000
スループット:1秒あたり3555レコード

---チャンク3--
等

また、EventLogテーブルには、メッセージがいつ書き込まれたか、どのプロセスがメッセージを書き込んだかなどを追跡するための列があります。この例にその情報を含めていないことに申し訳ありません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.