2015-03-18 3 views
0

У меня есть таблица, которая содержит список сборок. То, что я пытаюсь достичь, состоит в том, чтобы сгруппировать эти сборки с помощью ссылочного ID и взять 5 или 10 последних (по build_date) и посмотреть их статусы. Поэтому я сейчас делаю группу и возвращаю их.Запросы Linq очень медленные

using (var ctx = new Entities()) 
{ 
    return ctx.Builds.Where(x => x.build_date > dateTime) 
       .GroupBy(x => new 
       { 
        x.configuration_id 
       }) 
       .Select(s => new ConfigurationBuilds 
       { 
        ConfId = s.Key.configuration_id, 
        Builds = s.Select(x => x).OrderByDescending(d => d.build_date).Take(count) 
       }) 
       .ToList(); 
} 

Позже в другом методе я буду проверять все статусы Builds элементы, чтобы увидеть, если они соответствуют любым критериям, что-то вроде:

items.Where(build => build.Builds.Count() >= 9) 
        .Where(build => build.Builds.All(x => !x.build_status.Equals("SUCCESSFUL"))) 
        .ToList(); 

Проблемы с первым запросом, в котором я делаю groupBy. Это очень медленно, как я могу оптимизировать эту процедуру?

Я createad фиктивную процедуру, чтобы выбрать все версии и группы по статусам

var items = ctx.Builds.Where(x => x.build_date > dateTime).OrderByDescending(x=>x.build_id) 
        .GroupBy(x => new { 
         confID = x.configuration_id, 
         status = x.build_status 
         }) 
       .Select(s => new 
        { 
         Id = s.Key.confID, 
         Status = s.Key.status, 
         Cnt = s.Count() 
        }).OrderBy(d=>d.Id) 
        .ToList(); 

Это один на тех же данных, прокладывает быстро, но на самом деле не делать то, что мне нужно. Мне нужно: для каждой группы конфигурации выберите n число последних построений, которые соответствуют некоторым критериям. Как это сделать?

+0

@TimSchmelter есть Неисторический некластеризованный индекс, и я использую SQL Server v12 –

+0

Похоже, вы используете Linq для Entities или Entity Framework. Все, что нужно помнить об этих запросах, заключается в том, что они переводятся в SQL. Используя SQL Profiler, вы можете захватить созданный и выполненный запрос. Затем вы можете выяснить, какие индексы вам нужно добавить, чтобы улучшить его производительность. –

ответ

2

Хороший способ - определить, какой SQL он генерирует, использовать такой инструмент, как LINQpad. Получив представление о том, как выглядит SQL, вы можете использовать инструменты SQL, такие как создание плана выполнения.

Или вы можете использовать профилировщик SQL, чтобы узнать, что происходит с SQL-запросами.

+0

Thaks для этого, мне просто интересно, есть ли что-то явно неправильное с моим кодом. –

+0

Как вы можете выбрать коллекцию сборников в параметре select, возможно, не будет работать хорошо. Но использование инструментов профилирования - лучшая ставка для выявления его проблемы. –

Смежные вопросы