我正在尝试优化此查询。它现在并不慢,但我预计在不久的将来会出现峰值。还有什么我可以做的,以使这个查询更快?
var posts = from p in context.post
where p.post_isdeleted == false && p.post_parentid == null
select new
{
p.post_date,
p.post_id,
p.post_titleslug,
p.post_title,
p.post_descriptionrender,
p.userinfo.user_username,
p.userinfo.user_userid,
p.userinfo.user_GravatarHash,
p.userinfo.user_points,
p.category.catid,
p.category.name,
p.post_answercount,
p.post_hasbestanswer,
p.post_hits,
p.post_isanonymous,
p.post_votecount,
FavoriteCount = context.favorites.Where(x => x.post.post_id == p.post_id).Count(),
tags = from tg in context.posttag
where tg.posttag_postid == p.post_id
select new
{
tg.tag.tag_id,
tg.tag.tag_title
}
};
答案 0 :(得分:0)
在一般意义上,您可以查看缓存该信息,但对查询本质上没什么“慢”。这实际上取决于查询的使用方式(频率,搜索的数据等)。对于给定的问题,有许多可能的优化解决方案,虽然您可能会发现基于直觉的改进,如果您有适当的分析工具来确定问题区域,那么您将更容易这样做。此外,您将满意地证明您所改进的领域值得投入时间。
答案 1 :(得分:0)
此查询的一种可能优化方法是,仅加载其他相关对象(UserInfo,Category,Tag)的ID,并仅使用延迟加载策略按需初始化此对象。或执行其他查询来解析这些对象。
但这取决于您如何使用查询结果。也许您需要相关对象的所有信息,或者您只需要这些对象的一些信息或对象的Id就足够了,因为您需要其他查询的ID。
答案 2 :(得分:0)
我可以使LINQ 更清洁(通过using associations instead of psuedo-joins),但它不会让它更快。要使其更快,您可能需要查看数据库索引。