SQL Serverが重い時、調査のためにはどの処理が重いのか確認する必要があります。そのために役立つツールが「SQL Server Profiler」です。
今回はSQL Server Profilerを使い、重い処理を特定するための基本的な手順を紹介します。
SQL Server ProfilerはSSMSから起動できます。
SSMSのダウンロードがまだの場合はこちらの公式ドキュメントを参考にダウンロードを行って下さい。
SQL Server Profilerを起動したら、トレースを行いたいDBへ接続します。ただしトレースの際には一定の負荷がかかるので、検証環境を利用したり、本番環境であればほとんど利用のない時間帯に行う必要があります。
トレースの結果にはDBの操作に関する全てのログが出てくるので、原因を特定するのは簡単ではありません。そのため事前にフィルタを設定しておくのが良いでしょう。
条件は多々ありますが、データベースが重いという事で調査を行うのであればDurationという項目でのフィルタが適していると思います。Durationは対象の操作の実行にかかった時間という意味らしく、ここでフィルタをかければ重い処理を確認できます。
またDurationの時間で調査を行う場合「Audit Logout」という項目は除いてしまった方が良いと思います。セッションの開始から終了までの時間が表示されますが、知りたいのはその途中のどの処理で時間がかかったか、だからです。
DBに接続した後は「トレースのプロパティ」という項目が表示されるので、ここで条件の設定を行いましょう。
自分の場合は1000ミリ秒を条件にフィルタをかけました。
実行後にしばらく待つと、画面にトレース結果が表示されます。必要な分だけ待った後、ツールバーの下のボタンで一時停止や停止を行いましょう。
これで実行に1秒以上かかっている処理の一覧を表示する事ができます。
自分の場合は「SQL:BatchCompleted」という項目で10秒以上かかる処理を見つけました。その列を選択すると、実行されたSQLを確認する事ができます。中身を確認すると、SQL文にWHERE句が存在せず、50万件以上のデータを都度取得する処理が入っている事が分かりました。
ここまではDurationの時間を手がかりに調査を進めましたが、他の項目での確認を行いたい場合もあるでしょう。その場合はフィルタの条件を設定し直す事ができます。
結果のテーブルを右クリックして「プロパティ」を選択すれば、条件を再設定する事はできますが、この場合は新規にその条件でトレースを行う事になります。
今取得したトレースの結果を違う条件で見たい場合は、一度結果をtrcファイルに保存し、開き直す事で対応できます。
データベースの知識は素人に近い状態でも、このツールを使えば問題にある程度の当たりを付ける事ができました。問題の範囲を絞る事ができれば、専門家の人に依頼する時も話が通りやすくなりますし、場合によっては自分での解消も可能です。
とっつきにくさはありますが、標準のツールがしっかりしているのはMicrosoft系列の良い所だと思いました。