1

現在、ASP.NET MVC 3プロジェクトでEntity Frameworkを使用しています。 そして、ビュー内のレコードをループして表示する際に、重大なパフォーマンス上の問題が発生しています。Entity Framework 4.1パフォーマンスの問題

データがすぐに受信されているため、リモートのOracleサーバーへの接続ではなく、使用しているモデルに遅延ロードされた関係はありませんが、各レコードは単純な処理に120〜アクションリンクを含む3つのフィールド出力。

現在、800,000レコードでページを読み込むのに3分以上かかります。

私は設定オプションを使って調整を試みましたが、どれも役に立たないようです。

誰にでもアイデアはありますか?

編集:コントローラコード

readonly OracleSampleManagerContext db = new OracleSampleManagerContext(); 

public virtual ActionResult Index() 
{ 
     var spList = db.SamplePoints.OrderBy(e=>e.Id).ToList(); 
     return View(MVC.Reports.Views.SamplePointList, spList); 
} 

    <h2> 
    Selection By Sample Point 
</h2> 

<table> 
@foreach (var sp in Model) 
{ 
     System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch(); 
     sw.Start(); 

    <tr> 
     <td>@Html.ActionLink(sp.Id, MVC.Reports.Results(sp.Id))</td> 
     <td>@sp.Description</td> 
     <td>@sp.PointLocation</td> 
     <td>@sw.ElapsedMilliseconds</td> 
    </tr> 

    sw.Stop(); 
    sw.Reset(); 
} 

</table> 

例:

0200 72" Sewer to river - Once through cooling water  OUTFALLS 346ms 
0400 66" Sewer to river - Combined effluent OUTFALLS 347ms 
0500 54" Sewer to river - Once through cooling water  OUTFALLS 388ms 
06-AI-18 TBA in Water IB2  228ms 
06-AI-31 TBA in Water IB2  172ms 
+1

あなたはもっと私たちを見せなければなりません。あなたはモデルにどのように人を送り込んでいますか? MVC.Reports.Results()とは何ですか? –

+0

'Model'が作成されたときにクエリが実際に実行されていますか?たとえば、その時点で 'ToList()'をやっていますか? –

+1

これはちょっとニッチですが、ストップウォッチの宣言行をループの外側に移動する必要があります。 –

答えて

2

私の推測では、MVC.Reports.Results(sp.Id)は、DB検索のいくつかの並べ替えを行うことで、あなたはそれを送信する前に、リストにあなたのモデルを変換するため、レコードごとにデータベースを再度ヒットする必要があります。レコードを800ページにするには、データベースに1回ではなく801回の別々のトリップが必要です。

  1. 最初のクエリからToList()を削除します。
  2. リファクタリングMVC.Reports.Results(sp.Id)は、intではなくオブジェクトを受け取り、そのメソッド内でオブジェクトに対して直接作用します。

上記の両方で、エンティティコンテキストのスコープをアクション内からコントローラに移動する必要が生じることがあります。

+0

すべてを実行する前に、タイマー出力を動かす前に、アクションリンク –

+0

を呼び出す前にタイマーを削除していますが、パフォーマンスの問題の根本原因を見つけるために一時的にしか置かれていませんでした –

+0

コンテキストは現在、あなたの他の提案を試して、あなたに戻って –

関連する問題