代码之家  ›  专栏  ›  技术社区  ›  balexandre

ADO实体框架下的SQL慢度

  •  3
  • balexandre  · 技术社区  · 15 年前

    我需要创建一个 csv 包含所有当前订阅服务器的文件,以及一系列来自数据库的字符串。

    要获取我正在执行的所有订户:

    public IQueryble<Subscribers> ListAllSubscribersByCalendarId(Decimal cid)
    {
        return db.Subscribers.Where(x => x.calendar_id.Equals(cid));
    }
    

    很简单。

    问题是我已经有超过 五千 还有这个 需要永远 (字面意思)!

    即使只显示最后30条记录,也需要很长时间,我的查询是:

    public IQueryble<Subscribers> ListLast30SubscribersByCalendarId(Decimal cid)
    {
        return db.Subscribers
                   .Where(x => x.calendar_id.Equals(cid))
                   .Take(30)
                   .OrderByDescending(x => x.created_date);
    }
    

    我能做些什么来加快这个过程?

    4 回复  |  直到 15 年前
        1
  •  0
  •   3Dave    15 年前

    这应该发生在存储过程中。让数据库服务器做它擅长的事情:比如疯狂地运行查询。

        2
  •  3
  •   Aliostad    15 年前

    您的表达式需要在客户端上进行检查,无法转换为SQL语句。所以如果你跑步 SQL事件探查器 ,我打赌你会看到记录一个接一个地滴给客户。

    将条件更改为 x.calendar_id == cid

        3
  •  1
  •   Ali Tarhini    15 年前

    两种可能的选择:

    为x.calendar\u id创建非聚集索引:

    或者在应用程序中而不是SQL中进行排序:

    public IQueryble<Subscribers> ListLast30SubscribersByCalendarId(Decimal cid)
    {
        return db.Subscribers
                   .Where(x => x.calendar_id.Equals(cid))
                   .Take(30)
    }
    
    var ordered =  ListLast30SubscribersByCalendarId(1).ToList().OrderByDescending(x => x.created_date);
    
        4
  •  1
  •   Jon Adams    15 年前

    阿利奥斯塔德的回答应该会有很大帮助。同时确保 calendar_id 字段索引正确。

    首先,我只是在检查您是否要取前30个,但是数据库确定前30个是哪个,以及 然后 按创建日期对这30个进行排序?如果要根据创建日期获取前30个,则需要包括 created_date 在索引中适当地使用,以便可以在查询中使用它。

    最后,此答案假定您使用的工具将这些LINQ运算符正确映射到适当的SQL查询,而不仅仅是对内存中的整个记录集执行整个操作。