У меня есть таблица, которая содержит список сборок. То, что я пытаюсь достичь, состоит в том, чтобы сгруппировать эти сборки с помощью ссылочного 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 число последних построений, которые соответствуют некоторым критериям. Как это сделать?
@TimSchmelter есть Неисторический некластеризованный индекс, и я использую SQL Server v12 –
Похоже, вы используете Linq для Entities или Entity Framework. Все, что нужно помнить об этих запросах, заключается в том, что они переводятся в SQL. Используя SQL Profiler, вы можете захватить созданный и выполненный запрос. Затем вы можете выяснить, какие индексы вам нужно добавить, чтобы улучшить его производительность. –