Оцените свои навыки в SQL
Что проверяют
Не абстрактный уровень, а то, понимаете ли вы, что происходит между вашим кодом и базой. Многие Java-разработчики ходят в базу только через JPA и ни разу не видели реальных запросов, которые уходят на сервер. Именно это и выясняют.
Как отвечать
Разложите ответ по слоям и в каждом обозначьте границу.
- язык запросов: соединения, группировки, оконные функции, подзапросы и случаи, когда они хуже соединения;
- схема: ключи, типы, ограничения целостности, нормализация и осознанная денормализация;
- производительность: чтение плана через
explain, индексы и порядок колонок в них, статистика, сортировка, не помещающаяся в память; - транзакции: уровни изоляции и какие аномалии каждый допускает, оптимистическая блокировка через версию и пессимистическая через
select for update.
Обязательно свяжите с Java, это и отличает сильный ответ. Включённый вывод запросов Hibernate и понимание, какой запрос породила выборка. Проблема N+1 и её лечение через join fetch или граф сущностей. Разница между границей транзакции, которую задаёт @Transactional, и уровнем изоляции. Пакетная вставка вместо построчной. Почему жадная загрузка связей в сущности обычно ошибка.
Хорошо приземлить на случай из работы: долгий метод, включили лог, нашли выборку в цикле или отсутствующий индекс по внешнему ключу, проверили планом.
Где спотыкаются
Отвечают «SQL знаю, работаю через JPA» и не могут показать итоговый запрос. Внешний ключ без индекса, загрузка всей коллекции ради подсчёта размера, выборка целой таблицы в память: это не пробелы в SQL, это незнание того, что делает ORM.
Второе: называют @Transactional защитой от гонок. Аннотация задаёт границу транзакции и режим её распространения, а конкурентное изменение одной строки решается уровнем изоляции, блокировкой или версией записи.
Третье: подтверждают уровень процентами ускорения. «Переписал запросы, стало вдвое быстрее» без ответа, что показывал план и что именно изменилось, звучит как чужая история. Убедительнее назвать причину: неверный порядок колонок в составном индексе, приведение типов, из-за которого индекс не использовался, сортировка на диске.