Data / SQL — техническое интервью
60 минут, PostgreSQL. Джойны, индексы, оконные функции, нормализация, транзакции.
- Вопросов
- 14
- Live-coding
- 2
Разогрев: опыт и контекст
Опыт с SQL
С какими СУБД работали? Какой объём данных и типичные задачи?
Рубрика оценки (0–10)
3–5: «Писал SELECT» без контекста. 6–8: PostgreSQL/MySQL; миграции; отчёты, ETL, или backend queries. 9–10: Partitioning, replicas, explain analyze в проде. Красный флаг: «ORM пишет SQL за меня, руками не пишу» на data role.
Подсказки интервьюеру
2–3 минуты.
Запросы и модель данных
JOIN types
Объясните разницу INNER, LEFT и FULL OUTER JOIN на примере orders и customers.
Рубрика оценки (0–10)
3–5: «INNER — пересечение» без примеров строк. 6–8: Venn diagram; NULLs в LEFT; когда теряются строки. 9–10: Anti-join через NOT EXISTS vs LEFT NULL; performance note. Красный флаг: «FULL JOIN — всё всегда».
Подсказки интервьюеру
4 минуты.
Нормализация
До какой нормальной формы обычно проектируете OLTP-схему и почему?
Рубрика оценки (0–10)
3–5: «3NF» без определения. 6–8: 1NF–3NF на примерах; денормализация для read-heavy. 9–10: BCNF edge cases; star schema для analytics отдельно. Красный флаг: «одна таблица на всё».
Подсказки интервьюеру
4 минуты.
Индексы B-tree
Когда индекс на (status, created_at) поможет, а когда нет?
Рубрика оценки (0–10)
3–5: «Индекс ускоряет». 6–8: Left-prefix rule; selective predicates; write cost. 9–10: Partial index; covering index; EXPLAIN ANALYZE читает. Красный флаг: index every column.
Подсказки интервьюеру
Follow-up: low-cardinality status. 4 мин.
Оконные функции
Чем ROW_NUMBER отличается от RANK? Пример задачи, где нужен LAG.
Рубрика оценки (0–10)
3–5: «Для группировки» (путает с GROUP BY). 6–8: PARTITION BY / ORDER BY; RANK ties; LAG для сравнения с прошлым периодом. 9–10: running total; dedup with ROW_NUMBER; frame clause. Красный флаг: subquery там, где достаточно window.
Подсказки интервьюеру
5 минут.
EXPLAIN ANALYZE
Как читаете план запроса? На что смотрите в первую очередь?
Рубрика оценки (0–10)
3–5: «Seq Scan плохо» без контекста. 6–8: cost, rows, loops; Index Scan vs Bitmap; nested loop size. 9–10: Buffer hits; mis-estimates; ANALYZE stats. Красный флаг: оптимизирует без EXPLAIN.
Подсказки интервьюеру
5 минут.
Практика: SQL
Second highest salary
Напишите запрос: найти вторую по величине зарплату в таблице employees(salary).
Рубрика оценки (0–10)
3–5: MAX nested без DISTINCT edge case. 6–8: DENSE_RANK/RANK или subquery OFFSET; NULL if <2 rows. 9–10: DISTINCT ON; window + filter; index on salary. Красный флаг: LIMIT 1 OFFSET 1 без ORDER BY UNIQUE.
Подсказки интервьюеру
10 минут. Run выполняет скрипт целиком в SQLite, схема и данные уже в starter. В данных есть дубль зарплаты (200 у двоих) — проверяем, что кандидат отличает «вторую по величине зарплату» от «зарплаты второго человека».
Running total
Для таблицы payments(user_id, amount, paid_at) посчитайте накопительную сумму по каждому user_id по дате.
Рубрика оценки (0–10)
3–5: Self-join sum. 6–8: SUM() OVER (PARTITION BY user_id ORDER BY paid_at). 9–10: Frame ROWS UNBOUNDED PRECEDING; ties handling. Красный флаг: correlated subquery O(n²) as only solution.
Подсказки интервьюеру
10 минут. Run выполняет скрипт целиком в SQLite, схема и данные уже в starter. У user_id = 1 две оплаты в один день — повод обсудить ties и рамку окна.
Транзакции и надёжность
Изоляция
Объясните phantom read и какой уровень изоляции его предотвращает в PostgreSQL.
Рубрика оценки (0–10)
3–5: Путает dirty и phantom. 6–8: RC vs RR vs Serializable; PostgreSQL RR = snapshot. 9–10: Serializable predicate locks; retry strategy. Красный флаг: «READ UNCOMMITTED в Postgres» (не существует как таковой).
Подсказки интервьюеру
5 минут.
Deadlocks
Как возникает deadlock в БД и как проектировать порядок блокировок?
Рубрика оценки (0–10)
3–5: «Два транзакта ждут друг друга». 6–8: Lock order; короткие транзакции; retry on 40001. 9–10: Advisory locks; monitoring pg_locks. Красный флаг: «deadlock — баг Postgres».
Подсказки интервьюеру
4 минуты.
Инженерная культура и вопросы
Провести интервью по этому шаблону
Зарегистрируйтесь бесплатно: скопируйте шаблон в организацию, назначьте интервью и проведите его в комнате с live-coding.
Начать в FlashTalk