lambda 查询的优化

Posted

技术标签:

【中文标题】lambda 查询的优化【英文标题】:Optimalisation of lambda query 【发布时间】: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 毫秒。我认为它与选择有关...但实际上我不知道。

【问题讨论】:

执行需要多长时间?您正在访问多少条记录? Code Review 需要 6 秒。它应该提供大约 100 条记录,但在此查询结束时,我得到前 10 名。当计算订单和 orderItems 时,它可能访问几千条记录。我怀疑问题出在数据库的大小上,因为我有类似的表达式来访问 6 倍大的数据量并且需要 400 毫秒。我认为它与选择有关...但实际上我不知道。 【参考方案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 毫秒后准备就绪。感谢大家的努力。

【讨论】:

以上是关于lambda 查询的优化的主要内容,如果未能解决你的问题,请参考以下文章

Entity Framework lambda 扩展方法在啥时候将查询发送到数据库?

Lambda 函数完成,但对 RDS 的查询不完整

为啥 Lambda 变量范围存在于 LINQ 查询之外?

AWS AppSync Lambda 解析器获取查询返回类型

lambda查询

这个带有 Join 的 Linq 查询如何写成 Lambda?