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

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

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

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

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

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

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

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

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

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

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

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

Все подборки
  • Python14 550
  • Облачные технологии10 965
  • QA вакансии3 255
  • Android1 702
  • Инженер данных1 270
  • Продакт-менеджер586

Разработка

  • Backend вакансии1 657
  • iOS1 575
  • AI вакансии798
  • Fullstack вакансии672
  • Frontend вакансии578
  • Mobile вакансии30

По стеку

  • Go7 978
  • Java5 162
  • Node.js1 622
  • Kotlin1 384
  • Rust1 326
  • .NET1 258
  • PHP538
  • C++386
  • C#356

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

  • Kubernetes6 272
  • Linux-инфраструктура4 763
  • DevOps вакансии4 488
  • Terraform / IaC3 459
  • Мониторинг и Observability1 587
  • CI/CD1 482
  • SRE458
  • Кибербезопасность127

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

  • Аналитик данных683
  • Бизнес-аналитик638
  • Data Scientist622
  • Системный аналитик92

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

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

По регионам

  • Вакансии в США34 823
  • Вакансии в Европе15 244
  • Работа в России3 882
  • Вакансии в Канаде3 408

По формату

  • Удалённые вакансии54 624
  • Релокация в США34 823
  • Гибридная работа9 269
  • Офисная работа6 545

По уровню

  • Senior вакансии31 197
  • Middle вакансии14 037
  • Junior вакансии5 059

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

Все компании
  • Wise194 вакансии
  • Rakuten189 вакансий
  • ASML164 вакансии
  • Grab134 вакансии
  • Celonis45 вакансий
  • Spotify37 вакансий
  • Infobip28 вакансий
  • Adyen27 вакансий
  • Monzo19 вакансий
  • Darktrace17 вакансий

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

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

Что такое N+1 query problem? Как ловить, как чинить?

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

N+1 — когда за списком из N строк приложение делает ещё N отдельных запросов; обнаруживают через pg_stat_statements/APM, исправляют JOIN, batch-загрузкой (ANY) или ORM selectinload.

Как обнаружить

  • pg_stat_statements — смотреть на запросы с очень высоким calls и идентичным текстом, различающимся только bind-параметром.
  • Логи PostgreSQL — включить log_min_duration_statement = 10 и искать повторяющиеся короткие запросы подряд.
  • APM/tracing — DataDog, Jaeger, OpenTelemetry покажут «waterfall» с десятками одинаковых span-ов внутри одного HTTP-запроса.
  • Django Debug Toolbar / SQLAlchemy event logging — счётчики SQL на уровне фреймворка.
-- Найти часто вызываемые короткие запросы
SELECT query, calls, mean_exec_time, total_exec_time
FROM pg_stat_statements
WHERE calls > 1000
  AND mean_exec_time < 5
ORDER BY calls DESC
LIMIT 20;

Что такое N+1 query problem

N+1 возникает, когда приложение сначала делает один запрос за списком записей, а потом для каждой записи из списка выполняет ещё один отдельный запрос. Итого: 1 + N запросов. Классический пример — ORM загружает 100 заказов, а потом делает 100 отдельных SELECT для получения данных о клиенте каждого заказа.

Как исправить

1. JOIN — для one-to-one / many-to-one:

-- Было: SELECT * FROM orders; + для каждого: SELECT * FROM users WHERE id = ?
-- Стало:
SELECT o.order_id, o.total, u.email
FROM orders AS o
JOIN users AS u ON u.user_id = o.user_id
WHERE o.created_at > now() - interval '7 days';

2. Batch load с WHERE id = ANY(...):

-- Собрать все user_id из результата первого запроса
SELECT user_id, email, name
FROM users
WHERE user_id = ANY(ARRAY[1, 2, 3, 4, 5]::bigint[]);

3. ORM prefetch / eager loading:

# SQLAlchemy: joinedload или selectinload
from sqlalchemy.orm import selectinload

stmt = (
    select(Order)
    .options(selectinload(Order.user))
    .where(Order.created_at > datetime.now() - timedelta(days=7))
)
result = await session.execute(stmt)
orders = result.scalars().all()

4. Агрегация вместо individual-запросов:

SELECT u.user_id, u.email, COUNT(o.order_id) AS order_count
FROM users AS u
LEFT JOIN orders AS o ON o.user_id = u.user_id
GROUP BY u.user_id, u.email;

Проверка результата

После фикса сравниваем: число SQL-запросов на эндпоинт (через APM), calls в pg_stat_statements, total latency p50/p99. Убеждаемся, что JOIN не породил дубли строк из-за one-to-many (нужен DISTINCT или агрегация).

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

  • Механический eager load всех связей заменяет N+1 на огромный JOIN с декартовым произведением и лишними данными — смотреть на rows в EXPLAIN.
  • Pagination теряется: попытка одним запросом загрузить всё дерево при наличии LIMIT/OFFSET даёт неверные результаты из-за дублей строк.
  • Кэш скрывает N+1 на dev/staging, при cache miss в production нагрузка возвращается в полном объёме.
  • Слишком большой batch (тысячи id в ANY(...)) может вызвать проблемы с планировщиком и выделением памяти.
  • selectinload делает второй SELECT с IN — при очень большом списке id это снова может стать узким местом.
  • ORM по умолчанию часто lazy-load: новый разработчик добавляет обращение к связи в шаблоне/сериализаторе и незаметно вводит N+1 снова.
  • Трассировка только p50 маскирует проблему: N+1 бьёт сильнее на пользователях с большим числом связей (хвост распределения).

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

  • Чинить только добавлением индекса.
  • Включать eager loading всех отношений.
  • Не измерять количество SQL на request.

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

  • Просит пример ORM-сценария.
  • Проверяет batch loading.
  • Уточняет метрики до/после.

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

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

Источники

  • https://www.postgresql.org/docs/current/pgstatstatements.html
  • https://www.postgresql.org/docs/current/tutorial-join.html
←Предыдущий вопросЧем WHERE отличается от HAVING? Почему нельзя ставить агрегат в WHERE?Следующий вопрос→Что такое оконные функции (window functions) в PostgreSQL и приведите примеры их использования?

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

PostgreSQLbackend-performancequery-optimization

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

  • Что делает VACUUM, VACUUM FULL, ANALYZE? Чем они отличаются и какой когда применять?
  • Какие уровни изоляции есть и чем отличаются (READ COMMITTED, REPEATABLE READ, SERIALIZABLE)? Какой по умолчанию в Postgres?
  • Что такое PITR и чем pg_dump отличается от base backup + WAL archive?
  • Каковы типы индексов в PostgreSQL (B-tree, Hash, GIN, GiST, BRIN)?