Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

+1 501новая вакансия за сутки·57 707вакансий открыто сейчас·Новое:Talanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Новые вакансии в TelegramРаботодателям
Talanto
Вакансии
Компании5 678
РезюмеAIПодготовкаСтатьи
BoostТарифыBoost
Войти

Не нашли подходящее?

Пусть нужная вакансия найдёт вас сама.

  1. Подборка в TelegramНовые вакансии по вашему фильтру — сразу в бота.Подключить
  2. Мэтчи по резюмеЗагрузите резюме — покажем, где вы подходите лучше всего.Загрузить
  3. Сохранить фильтрНастройте поиск один раз и возвращайтесь к новым вакансиям.Настроить
Что нового на TalantoTalanto осенью: поиск с цифрами, вакансия по шагам и каталог компаний

Для работодателей

Опубликуйте вакансию — отклики придут в ваш кабинет.

  1. Вакансиябесплатно
  2. Откликиконтакты бесплатно
  3. Наймэтапы и интервью

40 компаний публикуют вакансии напрямую · 4 400 кандидатов открыты к предложениям

Разместить вакансию

Популярные направления

Все подборки
  • Python11 001
  • Облачные технологии7 882
  • QA вакансии2 530
  • Android1 457
  • Инженер данных929
  • Продакт-менеджер312

Разработка

  • iOS1 361
  • Backend вакансии1 335
  • AI вакансии645
  • Fullstack вакансии521
  • Frontend вакансии460
  • Mobile вакансии28

По стеку

  • Go6 500
  • Java3 643
  • Node.js1 203
  • Kotlin1 161
  • Rust1 155
  • .NET787
  • PHP334
  • C++285
  • C#211

DevOps и инфраструктура

  • Kubernetes4 701
  • Linux-инфраструктура3 588
  • DevOps вакансии3 059
  • Terraform / IaC2 617
  • Мониторинг и Observability1 284
  • CI/CD929
  • SRE345
  • Кибербезопасность28

Аналитика и данные

  • Аналитик данных556
  • Data Scientist443
  • Бизнес-аналитик412
  • Системный аналитик71

Другие направления

  • Проджект-менеджер91
  • UI/UX дизайн72
  • Ручное тестирование14

По регионам

  • Вакансии в США28 307
  • Вакансии в Европе10 602
  • Работа в России3 671
  • Вакансии в Канаде2 400

По формату

  • Удалённые вакансии44 927
  • Релокация в США28 307
  • Гибридная работа6 438
  • Офисная работа4 602

По уровню

  • Senior вакансии22 956
  • Middle вакансии11 692
  • Junior вакансии3 903

Сейчас нанимают

Все компании
  • Wise190 вакансий
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab135 вакансий
  • Celonis45 вакансий
  • Spotify36 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace16 вакансий

Вакансии из 344 источников: карьерные страницы компаний и джоб-борды.

КомпанииО насНовостиПубличная офертаУсловия использованияПолитика конфиденциальностиПоддержка
←К теме Entity FrameworkВсе вопросы
Entity FrameworkSeniorПроектирование систем

Как оптимизировать производительность EF Core для сценариев с интенсивным чтением?

В закладки
Сначала попробуйте ответить сами30 секунд
Сравнить с ответом ↓

Основные техники: AsNoTracking для всех read-only запросов, проекция в DTO через Select, Compiled Queries для горячих путей, Split Queries при множественных Include, keyset pagination вместо OFFSET и индексы через HasIndex. Для аналитики — Dapper или сырой SQL.

1. AsNoTracking и AsNoTrackingWithIdentityResolution

// Простые запросы без навигационных свойств:
var products = await context.Products
    .AsNoTracking()
    .Where(p => p.IsActive)
    .ToListAsync();

// Когда одна сущность может встретиться в нескольких Include:
var orders = await context.Orders
    .AsNoTrackingWithIdentityResolution()
    .Include(o => o.Items)
    .ToListAsync();

Оптимизация производительности EF Core для чтения

Сценарии с интенсивным чтением требуют системного подхода: от конфигурации контекста до правильного маппинга результатов. Ниже — конкретные техники с примерами.

2. Проекция в DTO вместо загрузки полных сущностей

Загружайте только нужные поля — SQL-запрос будет меньше, сеть и память используются эффективнее:

var dtos = await context.Products
    .Where(p => p.CategoryId == categoryId)
    .Select(p => new ProductDto
    {
        Id = p.Id,
        Name = p.Name,
        Price = p.Price
    })
    .ToListAsync();

3. Compiled Queries для «горячих» путей

private static readonly Func<AppDbContext, int, IAsyncEnumerable<ProductDto>> GetByCategory =
    EF.CompileAsyncQuery((AppDbContext ctx, int catId) =>
        ctx.Products
            .Where(p => p.CategoryId == catId)
            .Select(p => new ProductDto { Id = p.Id, Name = p.Name }));

// Использование:
await foreach (var dto in GetByCategory(context, 5)) { ... }

4. Split Queries против декартова взрыва

var orders = await context.Orders
    .Include(o => o.Items)
    .Include(o => o.Tags)
    .AsSplitQuery()
    .ToListAsync();

5. Пагинация через OFFSET/FETCH или keyset

// Offset-based (медленно на больших таблицах):
var page = await context.Products
    .OrderBy(p => p.Id)
    .Skip((pageNumber - 1) * pageSize)
    .Take(pageSize)
    .AsNoTracking()
    .ToListAsync();

// Keyset pagination (быстро):
var page = await context.Products
    .Where(p => p.Id > lastSeenId)
    .OrderBy(p => p.Id)
    .Take(pageSize)
    .AsNoTracking()
    .ToListAsync();

6. Индексы через конфигурацию модели

modelBuilder.Entity<Product>()
    .HasIndex(p => new { p.CategoryId, p.IsActive })
    .HasDatabaseName("IX_Products_Category_Active");

7. Глобальное отключение трекинга для read-only контекста

services.AddDbContextFactory<ReadOnlyDbContext>(options =>
    options
        .UseSqlServer(connectionString)
        .UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking));

8. Использование ExecuteReader / Dapper для отчётов

Для сложных аналитических запросов EF Core может быть медленнее, чем прямой ADO.NET или Dapper. В таких сценариях комбинирование — нормальная практика.

Подводные камни

  • AsNoTracking ломает lazy loading — загружайте всё через Include или явные запросы.
  • Select с анонимными типами не работает с Compiled Queries — используйте именованные DTO.
  • Split Queries создают несколько round-trips — при высокой latency к БД это может быть медленнее единого JOIN.
  • OFFSET на больших таблицах (>100k строк) деградирует — применяйте keyset pagination.
  • Computed columns, не включённые в индексы, часто приводят к Full Table Scan — проверяйте планы через context.Database.ExecuteSqlRaw("EXPLAIN ...").
  • Неправильно настроенный пул соединений ограничивает параллелизм при интенсивном чтении — настраивайте MaxPoolSize.
  • Горячий путь через ToListAsync() загружает всё в память — для больших наборов используйте AsAsyncEnumerable() и обрабатывайте построчно.

Частые вопросы на собеседовании

  • Как предотвратить проблему N+1 запросов в Entity Framework?
  • Как работают migration в EF Core? Как создавать и применять их?
  • В чём разница между eager loading, lazy loading и explicit loading?
  • Как сравнить Entity Framework с raw SQL, query builder и другими ORM по контролю, типобезопасности и производительности?

Типичные ошибки

  • Путать read-heavy оптимизация запросов EF Core с похожим механизмом из другой версии или платформы.
  • Игнорировать runtime-границы Entity Framework: lifecycle, DI scope, SQL translation, UI thread или platform API.
  • Не обсуждать null/empty/error cases и поведение под нагрузкой.

Что проверяет интервьюер

  • Кандидат объясняет read-heavy оптимизация запросов EF Core на конкретном примере, а не только определением.
  • Указывает последствия для производительности, тестируемости и поддержки.
  • Различает документированное поведение текущего стека и устаревшие практики.

Как вы знаете этот вопрос?

Проверить себя по теме Entity Framework →

Источники

  • https://learn.microsoft.com/en-us/ef/core/performance/
  • https://learn.microsoft.com/en-us/ef/core/performance/efficient-querying
←Предыдущий вопросВ чём разница между `SaveChanges()` и `SaveChangesAsync()`?Следующий вопрос→Представьте, после изменения кода на Entity Framework выросло число SQL-запросов и latency. Как вы будете это доказывать и чинить?

Связанные темы

Entity Frameworkdata-access-designperformance-debuggingruntime-reasoningsystem-design