【问题标题】:How can we optimize this linq to entity query to decrease the response time?我们如何优化此 linq to entity 查询以减少响应时间?
【发布时间】:2010-01-08 14:57:10
【问题描述】:
IQueryable<WebEvent> mySearch = 
    eventDC.GetBooks()
        .Where(p => p.Price.Any(d => d.EventDatetime.Month == fromDate.Month 
                                     && d.EventDatetime.Year == fromDate.Year))
        .WithGroup(groupId)
        .OrderBy(p => p.Price.Where(r => r.Datetime >= fromDate)
                             .OrderBy(q => q.Datetime)
                             .FirstOrDefault().Datetime);
List<Book>ventsList = mySearch.ToList<Book>();

我们有这么长的查询,取书和排序耗费大量时间,经过性能测试,我们发现包含该查询的页面的响应时间超过10秒,我们需要寻求解决这个问题和缩短响应时间。

有人有什么建议吗?

【问题讨论】:

  • 您可以通过不让我们滚动来优化它的 可读性,作为起点...我还建议您发布生成的 SQL - 理想情况下,查询某种形式的执行计划和瓶颈。
  • 我使用 linq to entity ,如何获取生成的 sql ?
  • 使用 ObjectQuery.ToTraceString() 或 SQL Profiler。 LINQPad 在这里也很有帮助。
  • 我已经为您重新格式化了它,但是这样做清楚地表明该代码实际上不会编译。你需要自己解决这个问题。

标签: c# asp.net linq linq-to-entities database-optimization


【解决方案1】:

你到底想做什么?你能告诉我这里的架构吗?

这对我来说似乎是一个奇怪的陈述,因为我不知道架构:

p => p.Price.Any(d => d.EventDatetime.Month...

但是,我要在这里暗中试一试,然后说您可能有以下问题:

eventDC.GetBooks()

如果该方法调用存储过程或以其他方式对数据库执行“Select * From Books”,那么您实际上在做的是:

  1. 从数据库中选择所有书籍
  2. 获取结果列表并从中仅选择您想要的书籍

如果是这种情况,那么这可能是你最大的问题。

【讨论】:

  • 正是我要说的。 @MemoryLeak 要对其进行测试,请拆分代码行并单步执行以查看哪个似乎花费了最长的时间。 p.Price.Any( 的选择也让我感到困惑。
【解决方案2】:

通常检查 SQL 以查看其生成的内容,您可以内联执行此操作。有一个工具可以帮助你做到这一点,它叫做 LinqPad,你可以创建一个 LINQ 查询并调整 LINQ 查询。另外,寻找添加索引的地方;这也可以提高性能(太多的索引会损害性能,所以也要小心)。

【讨论】:

    猜你喜欢
    • 2012-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-10
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    相关资源
    最近更新 更多