7

以下のクエリを使用して、Entity Frameworkから(データを返す)ストアドプロシージャを呼び出しています

from sp in db.GetSale(bID, SID,m,y).Where(x => x.isActive == true)
select sp

このプロシージャを直接実行すると、2秒しかかかりませんが、EFを介してこのストアドプロシージャを呼び出すと、10〜15秒かかります。

状況を改善するためのガイダンスはありますか?私はここでSOに関する他の投稿を見ましたが、成功しません

編集

これが私の手順のsqlplanです https://skydrive.live.com/redir?resid=87DCBD5D3E9AAA57!374

4

2 に答える 2

12

パラメータスニッフィングが疑われます。

手順にアンチパラメータスニッフィングコードを適用してみてください。(ローカル変数を使用する前に、パラメーターをローカル変数に割り当てます)。

http://blogs.technet.com/b/mdegre/archive/2012/03/19/what-is-parameter-sniffing.aspx

于 2012-10-03T12:13:44.223 に答える
2

.Where(x => x.isActive == true)フィルタはプロシージャ自体には適用されないことに注意してください。テーブルを処理する場合、フィルターはwhere句に渡され、DBで実行されます。あなたの場合、procは(active句なしで)実行され、完全な結果セットがアプリケーションに返され、その後、whereが適用されます。

procの方が速いとおっしゃっていましたが、どういうわけかisActive = trueをパラメーターとして渡していないのでしょうか?

このプロシージャにはすでにパラメータがあるようです。ステータスを別のパラメータとして追加し、クエリレベルで適用すると、パフォーマンスが向上する可能性があります。

于 2012-10-03T11:41:56.897 に答える