2011-02-03 17 views
1

私の質問はいくつかの部分に分かれており、長くなる可能性があるので、残念です。アプローチ - パフォーマンスのためのLINQの最適化

私はLINQを使用してSilverlightクライアントにデータを渡しています。

パート1:接続プール&最適化: LINQがデータベースへの接続を1つだけ確立し、接続プーリングを確実に行う方法を知りたいと思います。以前は、SQL接続文字列自体に接続プールプロパティを配置していました。したがって、DBMLファイルでテーブルを追加するときに接続文字列が設定されているこの設定ファイルを置くと、LINQはLYNQを尊重します。 LINQ(DBML)はデータアクセスレイヤのコアとなります。私は、基本的にLINQクエリであるメソッドを持つクラスを作成します。 データ関連部分を扱う私のコードで、 "using"ブロックでDataContextオブジェクトを使用します。 これがLINQが複数の接続を使用している理由ですか? DataContextをクラスレベルの変数として使用している場合、1つの接続しか保証されませんか?

パート2:最適化 ADO.Netの時代では、ストアドプロシージャを作成し、DataReaderを介して実行してから、DataReaderをループして、Modelクラスのオブジェクトを多く入力して渡しましたそのコレクションをDataGridにバインドします。 LINQ時代には、オブジェクトのコレクションを作成することと多かれ少なかれ同じことをしています。しかし、私は直接LINQ文を実行します。 SQLストアドプロシージャを使用するとパフォーマンスが向上しますが、LINQを使用してストアドプロシージャを実行すると、それは以前と同じくらい速く、適切なアプローチですか?

+0

実際のパフォーマンスの問題は何ですか? – Phill

+0

データアクセスが遅いため、全体的なパフォーマンスが低下します。 –

+0

です。したがって、問題はORMまたは接続プーリングではなく、データベース自体です。 – Phill

答えて

7

Ohoh ....非常に多くの悪い習慣。

パート2:そう遠くない 過去に最適化、ADO.Netの日、私は、 ストアドプロシージャを記述 のDataReaderを経由して、それを実行し、その後 のDataReaderをループ、私のように多くのオブジェクトを塗りつぶすために使用されます モデルクラスで、DataGridにバインドするコレクションの コレクションを渡します。 LINQ日で、私はもっと遠くに と同じように、オブジェクトのコレクションを作成します。 です。しかし、私は直接 LINQ文を実行します。私は、ストアドプロシージャをSQL が 私より高速なパフォーマンスが得られます推測することができますが、

は基本的には、過去には、いくつかのマイナーなdlusionsを持っていました。ストアドプロシージャでは、10年以上前からNO(!)のパフォーマンスが向上しています。それは明らかにドキュメントで綴られています。 SQLの実行は非ストアドプロシージャと同じくらい速く、クエリプランはキャッシュされ、両方のために再利用されます。

往復を避ける(つまり、クライアントからサーバーへの複数のバッチの要求を送信する)場合、SPは有効です(保存時間など)。そして、節約は、彼らが蓄積された手続きであるという事実によるものではなく、ラウンドトリップが費用のかかるという事実のためです。

悲しいことに、悲しいことに、多くのプログラマは、それらを手に入れた他の人たちから彼らを得るために妄想を抱いています... 10年前、ストアドプロシージャには本質的な利点がありました。これがSQL Server 6.5の時間です。7.0以降、これは歴史です。

http://weblogs.asp.net/fbouma/archive/2003/11/18/38178.aspx

基本的には、失われた開発時間と....に対する無用のコードの多くmostlikely測定できない利点を扱います。

パート1:接続が& 最適化をプールする:私は、LINQは、データベースへの唯一の1 接続を確立していることを確認し、また 接続プーリングをたどる できる方法を知りたいです。

あなたはいません。基本的には、あなたよりも賢くなるようにはしないでください。何が問題なのですか?

プールするには、(sql server)が接続文字列に何かを置く必要はありません。もちろん、LINQは接続文字列で定義された接続プールを迂回することはありません。 LINQはこれまでデータベースと話していませんでした.ADO.NETを使用していますが、ADO.NETでは魔法のように動作が変わっていません。これは、上位レベルのORMが代わりに使用しているからです。接続文字列にはプーリングエントリがありますが、ADO.NETは引き続きそれらを参照し、それに従います。

ここで、サーバープールからのデータベース接続を1つだけ持つことがSTUPIDです。 ouを一度に1つのトランザクションに制限し、負荷が高くなると(つまり、複数の要求を同時に処理する必要がある場合)、パフォーマンスを完全に破棄します。

私はパートに関連するデータを扱う 私のコードのブロックを「使用」 でのDataContextオブジェクトを使用します。これは なぜLINQが複数の接続 を使用している可能性がありますか? DataContextをクラスレベルの変数として使用している場合、 は1つの接続のみを保証しますか?

Ah - 依存します。それは意味をなさないかもしれないが、そうでないかもしれない。あなたが問題を抱えていると思う前に、特にあなたがここで与えた情報量が多すぎる場合(つまり、none)、唯一の賢明なことをしてください:プロファイラをつかんで、あなたが持っているかどうかを測る。 Openng /接続を100回または1000回閉じることは、プロファイラに表示されません。何も問題を解決する必要はありません。

しかし、私はメソッドごとの接続のオープニングが好きではありません - それは通常、悪いクラスデザインを示しています。接続は作業単位内で再使用する必要があります。

関連する問題