2017-09-14 94 views
1

添加组后慢查询我有一个运行速度非常快一个下面的查询:实体框架 - 通过

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); 

不过,如果我添加group by和更改查询下面的语句,它运行得慢得多。

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秒,这使得应用程序在服务器上几乎是即时的,但是第二种方式使SQL在远程时加载大约39秒。

它可以被修复而不必将整个查询重写到视图或存储过程中吗?

回答

1

分组是数据库端的昂贵操作。不知道你的数据库是什么样的,以及你设置了哪些索引,这将很难确定。为什么不在数据到达之后在客户端进行分组(假设它不是压倒性数额)。

这个问题解释了如何。 Group by in LINQ

+0

我也有这个想法,但是然后跳过/采取分页将不正确,对吧? – Robert

+0

@Robert在这种情况下,您应该启动SQL事件探查器并查看生成的实体框架是什么。然后采取该sql并在SSMS中运行以查看执行计划。这会告诉你性能瓶颈是什么。 – AngryHacker

+0

当我向关系表添加正确的索引时,一切都变得快速起来。 – Robert