すべての SQL クエリを自動的に測定します
-
08-06-2019 - |
質問
で おそらく正規化は正常ではない ジェフ・アトウッドは、「あなたはあなたのソフトウェアを流れるすべてのクエリを自動的に測定していますよね?」私はそうではありませんが、私はしたいです。
問題のアプリケーションのいくつかの機能:
- ASP.NET
- に依存するデータ アクセス層 MS エンタープライズ ライブラリ データ アクセス アプリケーション ブロック
- MS SQLサーバー
解決
Brad による SQL Profiler の言及に加えて、これをコードで実行したい場合は、次のようにします。 すべてのデータベース呼び出しは共通ライブラリを介して集中される必要があります. 。そこにタイミング コードを挿入すると、システム内のすべてのクエリにかかる時間がわかります。
データベースへの単一エントリ ポイントは、ORM またはデータベース層のかなり標準的な機能です。少なくとも、これまで私が取り組んできたプロジェクトにはありました。
他のヒント
SQLプロファイラー は、SQL Server に流れるトラフィックを監視するために使用するツールです。これにより、SQL Server に関する詳細なデータを収集できます。SQL Profiler は、少なくとも SQL Server 2000 以降 (おそらくそれ以前も) SQL Server とともに配布されています。
強くお勧めします。
Jeff Atwood と私が Web サイトのパフォーマンスの最適化について書いたこの章をご覧ください。多くのことを取り上げていますが、データベースのトレースと最適化についても多くの内容があります。サイトをスピードアップ:ASP.NET パフォーマンスに関する 8 つのヒント
の 落とし物 CodePlex のプロジェクトには、コードのブロックのタイミングを測定するためのクラスがあります。このクラスの名前は TimedLog です。IDisposable を実装します。時間を測定したいコードのブロックを using ステートメントで囲みます。
Rails を使用すると、すべての SQL クエリとその実行にかかった時間が開発ログ ファイルに自動的に記録されます。
これは非常に便利だと思います。なぜなら、時間がかかるものを見つけた場合、それを画面/ログファイルから直接コピーして貼り付け、mysql でその前に 'explain' を置くだけで済むからです。
コードを徹底的に調べて、何が起こっているかを再構築する必要はありません。
言うまでもなく、これは約 1 時間でディスク容量を使い果たすため、運用環境では起こりません。
SqlCommand を作成するファクトリを定義し、新しいコマンドが必要なときに常にそれを呼び出す場合は、 リアルプロキシ SqlCommand に。
このプロキシは、ExecuteReader / ExecuteScalar などの時間を測定できます。StopWatch を使用して取得し、どこかに記録します。SQL Server Profiler よりもこの種の方法を使用する利点は、実行された SQL 部分ごとに完全なスタック トレースを取得できることです。