2008-09-16 6 views
6

Linq to SQLを使用するときにSQLクエリを実行する良い方法はありますか?私は本当にログ機能が好きですが、どういうわけかそのクエリーの時間を計ることができれば素晴らしいでしょう。何か案は?Linq to SQLを使用するときにSQLクエリを実行する良い方法

+0

可能な限り自動方法を探しています。 StopWatchを使用するすべてのクエリを処理することはできますが、それは多くの作業です。 –

答えて

5

クエリと時間を取得するためのSQLプロファイラと、クエリアナライザの実行パスを使用して、ボトルネックがどこにあるかを確認します。

0

SQLプロファイラを使用して、LLBLGen Proでクエリをテストします。

2

System.Diagnostics.Stopwatchを使用すると、クエリの実行時間を追跡できます。 Linq-> SQLクエリは、それらを列挙するまで実行されません。また、Console.Outにログを記録している場合、パフォーマンスが大幅に低下することに注意してください。

0

ベストは、クエリをファイルに記録することです。SQLプロファイラを使用してクエリを実行し、クエリのインデックスを微調整します。

9

すでに2人が言っているように、SQLプロファイラはそのために使用するためのすぐ使えるツールです。私はエコーになりたくはありませんが、もう少し詳しく説明したいと思います:SQL Serverからの実際のタイミングを提供するだけでなく(ネットワーク側の入出力、接続と接続プールタイミングがケーキに追加されますが、I/O統計情報、ロック情報(必要に応じて)なども表示されます。

I/O統計情報が重要な理由は、クエリは、サーバーリソースの過剰な量を消費しながら高速に実行される可能性があります。たとえば、実行されるクエリが大規模なテーブルを頻繁にヒットし、一致するインデックスがテーブルスキャンの結果として存在しない場合、影響を受けるテーブルはSQL Serverによってメモリにキャッシュされます(可能な場合)。これにより、同じクエリが驚異的に速く実行されることがありますが、サーバーリソースを枯渇させてシステム/ app/dbの残りの部分を害することがあります。

ロック情報はほとんど同じくらい重要です - 単一のレコードのPKルックアップを行っている小さなクエリは、ロックとブロックによって不正なタイミングを持つことがあります。私はこのサイトが初期のベータ版ではデッドロックに悩まされている場所をどこかに読んでいます。 SQLプロファイラは、ロックに起因する問題の特定と解決のためのあなたの友人です。

要約すると、 L2S、EF、プレーンADOのいずれを使用していても、開発とテストの際に、アプリケーションがデータベースに対して「うまく動作する」ことを常に確認したい場合は、常にSQLプロファイラを用意してください。それは報われる!

編集:私は上記の答えは一緒に両方の長所を持ってL2Sための新しいランタイムのプロファイリングツールを開発している書いているので、 SQL ServerのI/O統計とサーバー側のタイミング、SQL Serverの実行計画、SQL Serverの「不足しているインデックス」アラート、マネージコールスタックと組み合わせることで、特定のクエリを生成したコードを簡単に見つけることができます。特定の基準を満たすクエリのみを記録する。さらに、ロギングコンポーネントをアプリと共に配布することで、実在する顧客環境でのランタイムクエリプロファイリングを容易にすることができます。このツールは、

http://www.huagati.com/L2SProfiler/からダウンロードできます。無料の45日間トライアルライセンスを取得することもできます。
http://huagati.blogspot.com/2009/06/profiling-linq-to-sql-applications.html

を...と、より高度なフィルタオプションの一部を使用してのサンプル/チュートリアルでは、ここに提供されています:ツールへ

長い背景の説明とイントロもここに掲載されて
http://huagati.blogspot.com/2009/08/walkthrough-of-newest-filters-and.html

1

あなたができることは、生成されたsqlをファイルまたはメモリに書き込むDataContext.LogにカスタムTextWriter実装を追加することです。その後、これらのクエリをループし、生のADO.NETコードでそれらを実行し、それぞれをストップウォッチで囲みます。

Profilerが公開されていないコードを開発していたときに見えたので、これまで同様の手法を使用していましたが、その結果をHTMLページに出力するのは簡単でした。 Webサイトのリクエストごとに2回実行しますが、Profilerで何かをキャッチするまで待つのではなく、実行時間を早めるのが役に立ちます。

また、SQLツールのルートに行く場合は、私はグーグル "最速のクエリのDMV"をお勧めし、DBの中で最も遅いクエリの統計情報を与えることができるストアドプロシージャを取得します。プロファイラの結果をスクロールして悪いクエリを見つけるのは必ずしも容易ではありません。また、SQL 2005のdmvを介した適切なクエリでは、CPUと時間などを指定して順序付けを行うこともできます。

関連する問題