У меня есть запрос linq, который занимает пару секунд (~ 2.6s) для запуска. Но я хочу уменьшить это как можно меньше.Оптимизация структуры сущности Запрос, избегайте ленивой загрузки
Мне нужно только чтение, поэтому я включил поведение .AsNoTracking().
Я также протестировал запрос без операторов include, но мои операции после запроса получения замедляли его, поэтому я оставил включенные функции для оптимизации моих других операций.
Основная цель состоит в том, чтобы уменьшить разговор в базе данных, а также инструкции ToList(), Include.
Код:
var obj = _context.MyContextModel.AsNoTracking()
.Where(x => x.CategoryList.Model.Id == 1)
.Where(x => x.CategoryList.Model.TypeId == 1)
.Where(x => x.Year.Select(y=>y.Datetime).Any(item => item.Year == 2010))
.Include(x => x.LinkedMarket).AsNoTracking()
.Include(x => x.Year).AsNoTracking()
.Include(x => x.CategoryList).AsNoTracking()
.Include(x => x.CategoryList.Model).AsNoTracking();
return obj.AsParallel().ToList();
Эта операция обычно возвращается около 1000-2000 MyContextModel записи, не включая "включает в себя"
Как я могу оптимизировать это дальше? Должен ли я загружать объекты в класс контейнера? или другое решение?
Update
_context.Configuration.ProxyCreationEnabled = false;
_context.Configuration.LazyLoadingEnabled = false;
var obj = _context.MyContextModel.AsNoTracking()
.Where(x => x.CategoryList.Model.Id == 1)
.Where(x => x.CategoryList.Model.TypeId == 1)
.Where(x => x.LinkedMarket.FirstOrDefault(mar=>mar.MarketID == marketId) != null)
.Include(x => x.Year).AsNoTracking()
.Include(x => x.CategoryList).AsNoTracking()
.Include(x => x.CategoryList.Model).AsNoTracking();
return obj.AsParallel().ToList();
В основном я удалил, где положение какого фильтр года (я это позже, для этого включаемого года) Я добавил ИНЕК, задающий рынок от .
Я удалил Include, который содержал рынок.
Один большой вор производительность была на Linked рынке (я не знаю точно, почему, что-то EF не нравится.)
Это уменьшило запрос о среднем на 0,4 секунды. И вся операция установлена с 4 + секунд до потрясающего 0,7 секунды.
Вы анализировали сгенерированный запрос на отсутствие индексов и т. Д. В SSMS? – ErikEJ
что-то скажите мне, что проблема прямо там. Где (x => x.Year.Select (y => y.Datetime). Любой (item => item.Year == 2010)) – Fredou
@ErikEJ. У меня нет контроля над БД, поэтому я все равно ничего не могу изменить. –