あまりにも使われていないようなので紹介してみる。
データベースアプリケーション開発をしている際、プログラム中で記述したSQLが
どうもうまく働いていないように思える場合、どういうチェックの仕方をするだろうか?
一般的には、プログラムを直接書き換え、SQL実行直前にコードを何行か追加して
どこか(画面にしろファイルにしろ)に出力させることがよく行われると思う。
そんな作業をしなくてもSQLServerには『SQLプロファイラ』というツールが付属している。
“スタート”メニュー → Microsoft SQL Server → 『プロファイラ』
(EnterpriseManager → “ツール”メニュー → 『SQL プロファイラ』でも同じ。
立ち上げたばかりの状態ではまっさらな画面が出るだけで何をして良いやら戸惑うが、
“ファイル”メニュー → 新規追加 → 『トレース』 を選択し、
“SQL Serverの接続”ダイアログに接続情報を入れ、
続いて表示される“トレースプロパティ”ダイアログはそのまま、
ひとまず『実行』ボタンを押してみよう。
それだけで『接続』した SQLServerに対して送られたSQL全てが横取りされてじゃかじゃか表示されるのだ。
適度なところでトレースを停止し、EventClass“SQL:BatchCompleted” なんかを目当てに中身を見てみれば
プログラム側にもデータベース側にも一切 手を加えなくても、実行された SQLがそのまま
参照できていることがわかる。
便利。
ただし、
問題点1.先に述べたように、標準ではその SQLServerに対しての“全ての記録”が取られる。
よって、複数のデータベースを使っていたり複数の開発者でテストしていたりする場合、
トレースにフィルタをかけないとやってられない。(フィルタのかけ方に関しては略)
問題点2.いったん SQLServer外から起動された後に、さらに内部起因で実行されるSQLに関しては
このプロファイラでは表示されない。
つまりストアドプロシージャの内部の実行状態を逐一確認するようなことはできない。
上記に関しては慣れとか使い分けが必要ということになる。
また、良くありがちな勘違いだが。
勘違い1.自分が最初この『SQLプロファイラ』を見たときは、
記録したSQLを再実行するための専用のツールなのかと勘違いしてしまった(その機能もある)
日本語での「トレースの実行」という表現が悪いように思うのだが、
上記の使い方をする限りは SQLServerに投げられる“SQLのキャプチャの開始”の意味にすぎない。
勘違い2.ここまで書いておいてだが、このツール本来の目的は単なる SQLのキャプチャではない。
本番運用前に何時間かこのプロファイラでトレースをしたまま仮運用し、
そのログを SQLServerの『インデックスチューニングウィザード』に食わせて
自動でインデックスを最適化させるためのネタにするのが本来の目的らしい。
(そんなことはツールに頼らず設計段階で考えておけ?)
まぁ、いろいろと深くはありそうですが、デバッグ時には自分は良く使うツールです。