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秒。
它可以被修复而不必将整个查询重写到视图或存储过程中吗?
我也有这个想法,但是然后跳过/采取分页将不正确,对吧? – Robert
@Robert在这种情况下,您应该启动SQL事件探查器并查看生成的实体框架是什么。然后采取该sql并在SSMS中运行以查看执行计划。这会告诉你性能瓶颈是什么。 – AngryHacker
当我向关系表添加正确的索引时,一切都变得快速起来。 – Robert