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 扩展方法在啥时候将查询发送到数据库?