【问题标题】:How do I optimize this SQL query?如何优化此 SQL 查询?
【发布时间】:2021-05-24 11:17:32
【问题描述】:

以下查询获取一个类别的所有论坛帖子。而且我还需要显示每个帖子的最新评论时间。但由于它,查询似乎需要更多时间。 (这是有道理的)。

但我无法弄清楚如何优化它,而且我不确定在哪里可以找到这方面的信息。 对于我的问题的任何提示或解决方案将不胜感激。

查询以获取该类别的初始帖子

var query = context.ctm_Forum_Post.Where(x => x.Deleted == false && x.FK_Categori_ID == Id)
    .Select(x => new ForumPostModel()
    {
        Id = x.Id,
        Title = x.Title,
        BodyText = x.BodyText,
        Summary = x.Summary,
        Archieved = x.Archieved,
        Created = x.Created,
        Deleted = x.Deleted,
        MemberID = x.FK_Member_ID,
        Sticky = x.Sticky,
        Updated = x.Updated,
        CategoryId = x.FK_Categori_ID
    }).ToList();

foreach (var item in query)
{
    item.LatestCommentTime = this.GetNewestCommentDateByPost(item.Id);
}
return query.OrderByDescending(x=> x.Created);

对于每一篇文章,我都必须再调用一次数据库。

 var query = (from comments in context.ctm_Comments
                                 join posts in context.ctm_Forum_Post on comments.Page_ID equals posts.Id
                                 where posts.Id == id && comments.Deleted == false
                                 orderby comments.Reqistration_timestamp descending
                                 select comments.Reqistration_timestamp).FirstOrDefault();

评论表

 public partial class ctm_Comments
    {
        public int ID { get; set; }
        public int Page_ID { get; set; }
        public int Member_ID { get; set; }
        public string Comment { get; set; }
        public Nullable<System.DateTime> Reqistration_timestamp { get; set; }
        public bool Deleted { get; set; }
        public Nullable<System.Guid> Page_Guid { get; set; }
    }

发布表格

public partial class ctm_Forum_Post
    {
        public int Id { get; set; }
        public string Title { get; set; }
        public string BodyText { get; set; }
        public string Summary { get; set; }
        public int FK_Categori_ID { get; set; }
        public bool Archieved { get; set; }
        public bool Deleted { get; set; }
        public bool Sticky { get; set; }
        public int FK_Member_ID { get; set; }
        public System.DateTime Created { get; set; }
        public System.DateTime Updated { get; set; }
    
        public virtual ctm_Forum_Category ctm_Forum_Category { get; set; }
    }

【问题讨论】:

  • minimal reproducible example 总是很好。想象一下,如果我有一个 Forum_PostPostComment 类,只有 key 和 fk、使用的属性(例如,deleted、timestamp)和一个用于识别它们的虚假属性。我们还可以使用 1 个帖子、2 个 cmets 进行简单的列表初始化。
  • 这里我想我不会尝试让LinQ2Sql编写查询。我会为懒人做一个简单的程序或视图。但是要 100% 使用 sql 以避免在翻译过程中出现任何问题。
  • 我添加了两个表@DragandDrop

标签: c# sql sql-server optimization


【解决方案1】:

您是否要在一个查询中提取所有内容?为什么不使用分页拉取最新的 10-20 个帖子,这样可以加快查询速度,然后使用单独的查询拉取该帖子的 cmets?

如果您需要提取大量数据,那么我建议使用存储过程,因为它已通过快速执行计划进行了优化。

我不确定您为什么使用 Join 来拉取 cmets,您可以在 Comment 字段中添加 Post ID,然后使用简单的查询来拉取该帖子的 cmets 而无需使用 Joins,除非您不尝试从 Post 拉取其他数据表..

【讨论】:

  • 我想我加入是因为我试图在一个查询中获取所有内容,然后当我做不到时我只是忘记删除它^^
【解决方案2】:

试试这个代码。

Reqistration_timestamp 属性添加到ForumPostModel

public class ForumPostModel
{
    //other property............................... 
    public Nullable<System.DateTime> Reqistration_timestamp { get; set; }
}

查询

var query = context.ctm_Forum_Posts
         .Join(context.ctm_Comments,
         post => post.Id,
         comment => comment.Page_ID,
         (post, comment) => new
         {
             p = post,
             c = comment
         }
        ).Where(x => x.p.Deleted == false && x.p.FK_Categori_ID == Id).OrderByDescending(x => x.c.Reqistration_timestamp).Take(1)
        .Select(x => new ForumPostModel()
        {
           Id = x.p.Id,
           Title = x.p.Title,
           BodyText = x.p.BodyText,
           Summary = x.p.Summary,
           Archieved = x.p.Archieved,
           Created = x.p.Created,
           Deleted = x.p.Deleted,
           MemberID = x.p.FK_Member_ID,
           Sticky = x.p.Sticky,
           Updated = x.p.Updated,
           CategoryId = x.p.FK_Categori_ID,
           LatestCommentTime = this.GetNewestCommentDateByPost(x.p.Id),
           Reqistration_timestamp = x.c.Reqistration_timestamp
        }).OrderByDescending(x => x.Created).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-29
    • 1970-01-01
    • 2017-03-01
    相关资源
    最近更新 更多