10 практических шагах, которые делают запросы EF Core быстрее в 10 раз — и о том, что чаще всего проблема не в EF, а в том, как разработчики его используют.
1️⃣ Добавлять индексы
EF не создаёт их сам. Он рекомендует вручную индексировать колонки из WHERE, JOIN и ORDER BY.
2️⃣ Оптимизировать проекции
Не нужно забирать целую сущность, если нужны 2–3 поля — лучше использовать .Select().
3️⃣ Использовать AsNoTracking для чтения
Отслеживание сущностей расходует память и CPU, поэтому для read-only операций он предлагает .AsNoTracking() или глобальное правило NoTracking.
4️⃣ Аккуратно использовать Include
Слишком много Include приводит либо к N+1, либо к огромным JOIN. Он советует включать только нужные связи.
5️⃣ Избегать больших IN / Contains
Тысячи значений в Contains() превращаются в тяжёлые IN. Лучше бить на батчи или использовать временные таблицы.
6️⃣ Делать пагинацию
Он подчёркивает, что нельзя грузить тысячные выборки целиком: нужны .Skip().Take() или курсорная пагинация.
7️⃣ Использовать скомпилированные запросы
Часто вызываемые запросы можно ускорить через EF.CompileQuery().
8️⃣ Включать SplitQuery
Это помогает избежать «картезианского взрыва», когда много Include создают огромное количество дублирующихся строк.
9️⃣ Писать RAW SQL, если логика сложная
Иногда проще и быстрее использовать FromSqlRaw(), чтобы контролировать план запроса напрямую.
🔟 Использовать кэширование
Часто запрашиваемые данные должны идти из кэша — MemoryCache, Redis или новый HybridCache в .NET 9+.
Бонус:
Перед оптимизацией он советует обязательно измерять узкие места: BenchmarkDotNet, SQL Profiler, планы выполнения.
Ссылка на оригинал
Post #1604
4.43K
