【问题标题】:Optimalisation of lambda querylambda 查询的优化
【发布时间】:2013-12-17 08:56:11
【问题描述】:

这是我的表达:

var d = DateTime.Now.AddDays(-60);
return db.Orders
.Where(o => o.CreateDate > d && o.Status > 3)
.Join(db.OrderItems, o => o.OrderId, o => o.OrderId, (o, p) => new { Order = o, OrderItem = p })
.Join(db.Customers, o => o.Order.CustomerId, o => o.CustomerId, (o, p) => new { o.Order, o.OrderItem, Customer = p })
.GroupBy(p => new {p.Customer.CustomerId, p.Customer.Name})
.Select(o => new CustomerMonthSale
{
CustomerId = o.Key.CustomerId,
Name = o.Key.Name,
Price = o.Sum(p => p.OrderItem.Price * p.OrderItem.Quantity)
})
.OrderByDescending(o => o.Price)
.Take(10).ToList();

需要 6 秒。它应该提供大约 100 条记录,但在此查询结束时,我得到前 10 名。当计算订单和 orderItems 时,它可能访问几千条记录。我怀疑问题出在数据库的大小上,因为我有类似的表达式来访问 6 倍大的数据量并且需要 400 毫秒。我认为它与选择有关...但实际上我不知道。

【问题讨论】:

  • 执行需要多长时间?您正在访问多少条记录?
  • 需要 6 秒。它应该提供大约 100 条记录,但在此查询结束时,我得到前 10 名。当计算订单和 orderItems 时,它可能访问几千条记录。我怀疑问题出在数据库的大小上,因为我有类似的表达式来访问 6 倍大的数据量并且需要 400 毫秒。我认为它与选择有关...但实际上我不知道。

标签: c# lambda query-optimization


【解决方案1】:

你的问题在它说的最后: .ToList() 我建议你删除它,我建议使用 PLinq (Parallel Linq),所以你的查询会是这样的:

    var q = from order in db.Orders.AsParallel()
        where order.CreateDate > d && order.Status > 3
        join orderitems in db.OrderItems.AsParallel() on order.OrderId equals orderitems.OrderId
        join customers in db.Customers.AsParallel() on order.CustomerId equals customers.CustomerId
        orderby order.Price descending
        select new { Coloumn_name = value, Column_name = value };
    var FinalList = q.Take(10);
// Choose the column names you want, and assign the value you want i.e. order.CreateDate
// so the select will be: select new {Create_Date = order.CreateDate, Client_Id = order.CustomerId ...etc};

【讨论】:

    【解决方案2】:

    我已经解决了这个问题。查询是正确的。问题在于“where”语句。它检查了没有设置索引的列“createDate”。我已经设置了索引,整个页面在 500 毫秒后准备就绪。感谢大家的努力。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-25
      • 2012-06-15
      • 2011-01-19
      相关资源
      最近更新 更多