3

エンティティモデルを使用してストアドプロシージャを呼び出すと、それを直接呼び出しよりもパフォーマンスが低下するという明らかな理由はありますか?ストアドプロシージャとエンティティフレームワークのパフォーマンス

最初に、私はSPが正確にで動作するとは思っていません。そして、SPに直接アクセスするときにEFがしなければならない様々なことがあります。

これ以外にも、3列の文字列を返すクエリがあります。私がEnterprise Managerを介して実行すると、すぐに実行されます。私がEF経由で走らせると、約6秒かかります。確かに、この結果は複合型にマップされているが、私はSQL Serverプロファイラによるクエリを実行したら、それは遅延がSQLサーバー上で起こることを確認するためには明らかです:ダイアグラムで

Performance of query being executed from two sources in SQL Server Profiler

、1 Enterprise ManagerからSQLが呼び出されたことを示します.2は、EFを使用してアプリケーションを介して呼び出されていることを示します。

私はここで間違っていますか?おそらく2〜2秒の遅れが予想されますが、その差はあまりにも大きいようです。

EDIT:

ADO.Net経由で呼び出されたときに、ストアドプロシージャも実行速度が遅いようです。私の同僚は、.Netがキャッシュしている悪い実行計画とは何かだと思っているようです。ストアドプロシージャを編集して再度保存すると、キャッシュにあったものがすべてクリアされたように見え、ストアドプロシージャへのADO.NetとEFの両方の呼び出しがうまく機能します。

これまでに他の誰かがこれに遭遇しましたか?

+2

AFAIK、ADO.NETは** **キャッシュの実行計画ではありません。それはSQL Serverです。EFにはプランキャッシングの概念もありますが、DB演算子ではなくクエリのコンパイル(.NET式→T-SQL)を指します。 –

+0

EFを使用してプロシージャを繰り返し実行すると、SSMSのT-SQLバッチによるプロシージャの繰り返し実行に比べて、より多くの時間がかかることが確認できますか? SQLプロファイラでこの不一致を観察していますか? –

答えて

4

this thread on SQL Server forumをご覧ください。それは少し似ており、いくつかの手がかりを与えるかもしれません。要するに、SSMSとADO.NETのSQL Server実行環境オプションが異なると、実行計画が異なります。 SQL Serverのプランキャッシュをクリアすると役立ちます。

+0

これが解決策です。 arithabortの他に、ansi_nullsのような他のオプションもあります。私はそれらのすべてをチェックすることをお勧めします。 – usr

+0

@Pavel - あなたの答えをありがとう、これはケースのようです。私は下の私の発見の完全な説明を追加しました、うまくいけば、これは他の誰かを助けるでしょう。 – GrandMasterFlush

2

Pavel GatilovがARITH ABORTの設定で頭に浮かんでいるようだが、私は自分の発見についてもう少し詳しく投稿するつもりだと思った。

This postは、同様の問題を回避するための議論でカバーしています。 EF接続とSQL.Data.Clientの間に "SET ARITHABORT ON"を持つDBへの呼び出しの前にラッパークラスを書くことが可能です。 MSDNのThis articleについて詳しく説明しています。

変更の複雑さを見て、アプリケーションをストアドプロシージャの使用から完全にEFを使用するように移動することを考慮して、弾丸を噛んで、EFデータモデルにSP機能を移行します。

+1

EFが最適なクエリを生成できないことに注意してください。パフォーマンス上の理由から、一部のSPを保持する必要があります。 –

0

単一のトランザクションで同じ呼び出しではないです

INSERT INTO foo (col1, col2) SELECT col1, col2 (with all 100 rows of the changes) 

ただ、両方のケースで生成されたクエリでかいま見を取り、データベースに直接、そのクエリをテスト100回

EXEC SP_foo_INSERT param1, param2 

を呼び出すより。それの実行計画が何であるかを見てください。

関連する問題