LINQ2SQL выбирает ордера и пропускает / принимает - PullRequest
2 голосов
/ 20 ноября 2011

У меня есть функция, которая принимает заказы из таблицы, но не все. Это пропустить (Страница * Строки на странице) и взять (Строки на странице). Но есть очень большая проблема (глядя в Linq2SqlProfiler).

  • Если я открываю 1 страницу (Skip = 0, Take = 50), у меня время выполнения: 150 мс.
  • Если я открою 2 страницы (Skip = 50, Take = 50), у меня будет время выполнения: 205 мс.
  • ...
  • Если я открою 10 страниц (Skip = 450, Take = 50), у меня есть время выполнения: 1005ms .
  • Если я открою 15 страниц (Skip = 700, Take = 50), у меня будет исполнение время: 1700мс !

    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 мс?

1 Ответ

3 голосов
/ 20 ноября 2011

Если посмотреть на предоставленное вами время выполнения образца, похоже, что время увеличивается линейно (150 -> 200 -> ... -> 1005 -> 1700) при открытии большего количества страниц.Таким образом, к тому времени, когда вы достигнете страницы 15, запрос должен обработать большее количество записей, чтобы получить данные, соответствующие странице 15. Я предполагаю, что это не проблема со страницей 15, но в целом сам запрос требует времени как числазаписи увеличивается.Вы можете попытаться оптимизировать запрос, настроив индексы таблиц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...