【发布时间】:2012-01-02 10:13:54
【问题描述】:
我有从餐桌接受订单的功能,但不是全部。它是skip (Page * Rows on page) 和take (Rows on page)。但是有很大的问题(在 Linq2SqlProfiler 中查看)。
- 如果我打开 1 页(Skip = 0,Take = 50)我有执行时间:150 毫秒。
- 如果我打开 2 页(Skip = 50,Take = 50)我有执行时间:205ms。
- ...
- 如果我打开 10 页(Skip = 450,Take = 50),我有执行时间: 1005 毫秒。
-
如果我打开 15 页 (Skip = 700, Take = 50) 我有执行 时间:1700ms!
public IEnumerable<Order> GetAllConfirmedOrders(DateTime firstDay, int? ProviderId = null, Guid? ManagerId = null, DateTime? date1 = null, DateTime? date2 = null, int iSkip = 0, int iTake = 50) { var predicate_order = PredicateBuilder.True<Order>(); var predicate_orderlist = PredicateBuilder.True<OrderList>(); if (ProviderId != null) predicate_orderlist = predicate_orderlist.And<OrderList>(ol => ol.ProviderAn == ProviderId); if (ManagerId != null) predicate_order = predicate_order.And<Order>(o => o.UserId == ManagerId); if (date1 != null && date2 != null) predicate_order = predicate_order.And<Order>(o => o.DateAdd >= date1 && o.DateAdd <= date2); else predicate_order = predicate_order.And<Order>(o => o.DateAdd >= firstDay); var orders = (from o in _dataContext.Orders join ol in _dataContext.OrderLists.Where(predicate_orderlist) on o.Analit equals ol.OrderAn where o.Status == 1 orderby o.DateAdd descending select o).Where(predicate_order).Skip(iSkip).Take(iTake); return orders; }
有生成sql条件:
WHERE [t2].[ROW_NUMBER] BETWEEN 50 /* @p2 */ + 1 AND 50 /* @p2 */ + 50 /* @p3 */
ORDER BY [t2].[ROW_NUMBER]
WHERE [t2].[ROW_NUMBER] BETWEEN 450 /* @p2 */ + 1 AND 450 /* @p2 */ + 50 /* @p3 */
ORDER BY [t2].[ROW_NUMBER]
WHERE [t2].[ROW_NUMBER] BETWEEN 700 /* @p2 */ + 1 AND 700 /* @p2 */ + 50 /* @p3 */
ORDER BY [t2].[ROW_NUMBER]
真的正常吗?有没有办法将执行时间节省近 100-200 毫秒?
【问题讨论】:
-
所有四个查询都很慢。检查您的索引!
-
我遇到了这个问题,在努力解决内存不足或页面加载速度越来越慢之后,我找到了一个更好的解决方案,可以在没有内存压力的情况下流式传输所有数据。它涉及关闭
DataContext中的ObjectTrackingEnabled属性:stackoverflow.com/questions/12468219/…
标签: c# asp.net sql linq linq-to-sql