2016-07-13 6 views
2

データベースの最初のEntity Frameworkを使用した単純なWeb MVCアプリケーションがあります。私はテーブルから情報を取得しています。それは非常に遅いです。Entity FrameworkがSQL Serverを何度も呼び出しています

私は2つの問題を抱えて:私は、SQL Serverプロファイラでクエリを確認するとき

  1. 、それは別の選択クエリでfrom句とSelectクエリとしてクエリを示しています。私はなぜそれがテーブル名の代わりに別の選択を使用しているのか分かりません。これはクエリを遅くすることができますか?

  2. 私は行を取得しているときに、プロセスを遅くする行ごとにデータベースを呼び出しています。これは、テーブルのキーを使用して、各行のデータベースを再クエリしています。なぜ各行のデータベースを呼び出すのですか?最初のクエリですべての行が返されませんでしたか?

以下は私のコードとSQ​​L Server Profilerの結果です。

コード:

List<FanDetail> fans = db.FanDetails.ToList(); 

foreach (var item in fans) 
{ 
    FanSummaryViewModel add = new FanSummaryViewModel() 
    { 
    Part_No = item.Part_No, 
    } 
} 

SQL Serverプロファイラは、クエリの結果:

SELECT 
    [Extent1].[Part_No] AS [Part_No] 
FROM 
    (SELECT 
     [FanDetails].[Part_No] AS [Part_No] 
    FROM 
     [dbo].[FanDetails] AS [FanDetails]) AS [Extent1] 

SQLプロファイラは、各用に結果:

exec sp_executesql N'SELECT TOP (1) 
    [Extent1].[Part_No] AS [Part_No] 
    FROM (SELECT 
    [FanDetails].[Part_No] AS [Part_No] 
    FROM [dbo].[FanDetails] AS [FanDetails]) AS [Extent1] 
    WHERE [Extent1].[Part_No] = = @p__linq__0',N'@p__linq__0 varchar(8000)',@p__linq__0='00405635' 

私なら、私を知ってみましょうより詳細な情報を提供する必要があります。

私はEFの新人です。しばらくの間、このパフォーマンスの問題に取り組んでいます。あなたは、単一のクエリ内のすべてのクエリと投影を実現することができるはず

答えて

3

List<FanSummaryViewModel> fans = db.FanDetails 
            .Select(item => new FanSummaryViewModel 
               { 
                Part_No = item.Part_No 
               }) 
            .ToList(); 

SelectステートメントToListメソッドは、パーサーが正しくスコープクエリを作成するのに役立ちますとフィールドのみを返します前には言及しましたリストが列挙されるときに各行に対して新しいオブジェクトを作成します。これはToListステートメントが達成するものです。

また、生成されたSqlのクエリパフォーマンスをデータベースに対して直接チェックして、問題がデータベースのみであるかどうかを確認してください。インデックスは、インデックスで修正できる場合があります。

+0

これは私が必要としていたものです。フィードバックとヘルプに感謝します。ページの読み込み時間が15-20秒から3秒に短縮されました。あなたの指示に従って、実装するのはとても簡単でした。 – user2011126

関連する問題