2017-09-14 13 views
1

してグループを追加した後、私は非常に高速に実行次のクエリを持っている:私は文を次のようにgroup byと変更クエリを追加する場合Entity Frameworkの - スロークエリ

var query = 
    (from art in ctx.Articles 

    join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId 
    join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId 
    join cat in ctx.Categories on artCat.CategoryId equals cat.Id 
    where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath)) 
    orderby art.PublishDate descending 
    select new ArticleSmallResponse 
    { 
     Id = art.Id, 
     Title = art.Title, 
     Active = art.Active, 
     PublishDate = art.PublishDate ?? art.CreateDate, 
     MainImage = phot.RelativePath, 
     RootCategory = art.Category.Name, 
     Summary = art.Summary 
    }) 
    .AsNoTracking().Take(request.Take); 

はしかし、それははるかにはるかに遅い実行されます。

var query = 
    (from art in ctx.Articles 

    join phot in ctx.ArticlePhotos on art.Id equals phot.ArticleId 
    join artCat in ctx.ArticleCategories on art.Id equals artCat.ArticleId 
    join cat in ctx.Categories on artCat.CategoryId equals cat.Id 
    where art.Active && art.ArticleCategories.Any(c => c.Category.MaterializedPath.StartsWith(categoryPath)) 
    orderby art.PublishDate descending 
    select new ArticleSmallResponse 
    { 
     Id = art.Id, 
     Title = art.Title, 
     Active = art.Active, 
     PublishDate = art.PublishDate ?? art.CreateDate, 
     MainImage = phot.RelativePath, 
     RootCategory = art.Category.Name, 
     Summary = art.Summary 
    }) 
    .GroupBy(m => m.Id) 
    .Select(m => m.FirstOrDefault()) 
    .AsNoTracking().Take(request.Take); 

各カテゴリで9回ホームページが呼び出されます。最初のバージョンのクエリでは、キャッシュをオンにせずにSQLにリモートで接続すると、ページの読み込みは約1.5秒になります。これは、アプリケーションがサーバー上にあるときにほとんど瞬時になりますが、2番目の方法では、SQLがリモートの場合、

クエリ全体をビューまたはストアドプロシージャに書き換えることなく修正できますか?

答えて

1

グループ化は、データベース側で高価な操作です。データベースの外観や設定したインデックスがわからないと、判断が難しくなります。データが到着した後にクライアント側でグループ化するだけではなく(圧倒的な量ではないと仮定して)

この質問はどのように説明しますか。 Group by in LINQ

+0

私はそのアイデアも持っていましたが、ページネーションをスキップ/取るのは正しいとは思いませんか? – Robert

+0

@Robertこの場合、SQLプロファイラを立ち上げ、sql Entity Frameworkが生成しているものを確認する必要があります。次に、そのSQLをSSMSで実行して、実行計画を確認します。それはパフォーマンスのボトルネックが何であるかを示します。 – AngryHacker

+0

リレーショナルテーブルに正しいインデックスを追加すると、すべてがスピードライトになりました。 – Robert