WindowsAzureで実行されているWebアプリケーションがあります。ASP.Net 4.0、MVC 3、Entity Framework 4.1、SQL Server 2008で、リポジトリパターンを使用して構築されています。
アプリは最近まで非常にうまく機能していました。ほとんどのお客様は数百行のデータを持っていますが、そのうちの1つは2000以上に達し始めています。これにより、ページの読み込み時間が大幅に遅くなりました(一部のページでは15〜20秒)。
MiniProfilerの使用を開始しました。これは、SQL呼び出しが重複している非常におしゃべりなアプリがあることを示しています。
可能な限り詳細を説明し、私たちが物事をより良くする方法を理解するために、私はいくつかのことを説明します。
2つの保護されたオブジェクト(CurrentUserとCurrentCompany)を持つベースコントローラーがあります。これらはアクションでかなり使用しますが、毎回DBにヒットします。したがって、これらのオブジェクトを初めてセッションに保存する必要があると想定しています。これらのオブジェクトの周りにまとめることに大きなオーバーヘッドがありますか?後でそれらの関係にアクセスするのはどうですか(CurrentCompany.Offices.First()など)?
これらのオブジェクトに基づいて各ページのデータを取得します。たとえば、次のように、それらの関係の選択、順序付け、フィルタリングを行います。
CurrentCompany.Employees.Where(r => r.StatusId = Enums.Statuses.Active);
ここで、「CurrentCompany.Employees」はEntityCollectionを返しますが、WhereはそれをIEnumerableに変更します。IQueryableが進むべき道だと聞きましたか?
また、EFは物事をすばやく立ち上げて実行するのに最適ですが、大量のデータでうまく機能するように調整する必要があることも読みました。私が読んだことから、2列だけを要求した場合でも、行全体が返されますか?
したがって、これらすべてを念頭に置いて、大規模なクライアント向けにこの規模を実現するために私が何をすべきかを誰かが指摘できますか。結局、2000行以上はそれほど多くはありません。ビュー/ストアドプロシージャを使用する必要がありますか?
基本的な選択などを使用してEFをセットアップする方法を説明するリソースはたくさんありますが、データセットが大きくなると実際にそれをスケーリングするものはありません。
どんな助けでも大歓迎です。ブライアン