2017-10-20 11 views
0

Web開発でEF6に問題があります。インデックスページでは、いくつかの情報を表示するためにクエリを実行する必要があります。問題は、最初のクエリがメモリ上にモデルを作成し、それを行うのに10秒以上かかります(素晴らしいホスティングではありません)。 人々はこれをどのように処理しますか?直接クエリで最初のデータを取得しますか? txtファイルを読む?エンティティフレームワーク6でモデルのパフォーマンスが生成される

+2

事前にEFビューを生成することができます。https://msdn.microsoft.com/en-us/data/dn469601.aspx – Riv

+0

クエリのコードを入力してください。 –

+0

@Riv私は前もってビューを生成しようとしています。私はこのオプションを前に見ましたが、それは10個のエンティティと少数の関係を持つシンプルなモデルです。デフォルトで動作するはずです... – Maxi

答えて

0

デフォルトでは、EFにはスナップショットの変更追跡メカニズムがあります。

エンティティの状態は、データベースからロードされるたびに保存されます。たとえばSaveChangesメソッドが呼び出されると、Entity Frameworkは現在のコンテキスト内のすべてのエンティティをチェックし、保存された状態と比較します。

これはこれはでコンテキストCTORチャックに...時々遅いタッチすることができます:

this.Configuration.AutoDetectChangesEnabled = false; 

これは、ここではオーバーヘッドのビットを奪う必要があるエンティティの追跡をオフにします。

しかし、かなり静的なデータであれば、アプリ起動時にキャッシュを使用してデータを保持することができます。メモリからデータを取り出し、x時間/分ごとにリフレッシュする必要があります。あなたは、私が期待してはるかに費用は一切かかりませんことができ、展開などのためで動作するように非常に簡単になる場合

また、余談として、AZUREに移動

0

二つのこと、私は思いますがあります。 do: 1)クエリをプロファイルし、実際に10秒かかるかどうか確認してください。 EFから生成されたSQLクエリを表示する方法については、LINQPad、Glimpse、またはStackifyプレフィックスを参照してください。非効率なクエリが問題になることがあります。 DB内のビューを使用するか、インデックスを設定すると問題が解決する可能性があります。

2)このクエリを1回実行し、その後の要求にメモリ内コピーを使用する場合は、MemoryCacheを使用します。最初の要求ではまだパフォーマンスが低下しますが、その後のすべての要求は、キャッシュが最後に設定されている間は非常に高速です。結果をメモリに長期間保存しているため、これを使用するとメモリヒットが発生します。すべての訪問者がインデックスページで動的リクエストを受け取った場合は、大量のメモリを使用します。要求がすべてのユーザーで同じ場合、これは最適なオプションです。

関連する問題