У меня есть запрос linq, который возвращает последнюю страницу, на которую пользователь смотрел, на основе таблицы обращений к странице. Поля: TimeStamp
, UserID
и URL
, которые регистрируются из активности пользователя. Запрос выглядит так:Что я могу сделать, чтобы улучшить скорость запроса?
public static IQueryable GetUserStatus()
{
var ctx = new AppEntities();
var currentPageHits = ctx.Pagehits
.GroupBy(x => x.UserID)
.Select(x => x.Where(y => y.TimeStamp == x.Max(z => z.TimeStamp)))
.SelectMany(x => x);
return currentPageHits.OrderByDescending(o => o.TimeStamp);
}
Запрос работает отлично, но работает медленно. Наш DBA заверяет нас, что таблица имеет индексы во всех правильных местах и что проблема должна быть связана с запросом.
Есть ли что-то по своей сути неправильно или BAD с этим, или есть более эффективный способ получить те же результаты?
Кажется, это довольно простой запрос ... Я не думаю, что он может быть оптимизирован очень. – xanatos
Исправьте меня, если я ошибаюсь, но не является PLINQ (Parallel LINQ) жизнеспособным вариантом здесь? https://msdn.microsoft.com/en-us/library/dd460688%28v=vs.110%29.aspx – cubrr
Вы должны зарегистрировать SQL, который генерируется из запроса, и проанализировать его, чтобы убедиться, что он эффективен. –