Каков уровень владения PostgreSQL
Что проверяют
Вопрос открытый, и по ответу интервьюер решает, насколько глубоко копать дальше. Ему важно понять, где заканчивается ваше «пишу запросы через ORM» и начинается понимание самой базы. Следом почти всегда просят разобрать план медленного запроса или объяснить уровни изоляции транзакций.
Как отвечать
Не ставьте себе оценку по шкале, опишите уровень через то, что умеете, от простого к сложному:
- SQL:
JOINвсех видов, оконные функции, CTE, upsert черезINSERT ... ON CONFLICT, работа сjsonb; - индексы: B-tree по умолчанию, GIN для
jsonbи полнотекстового поиска, частичные и составные индексы, почему функция над колонкой мешает индексу; - анализ запросов: читаете
EXPLAIN (ANALYZE, BUFFERS), отличаетеSeq ScanотIndex ScanиIndex Only Scan, видите, где планировщик ошибся с оценкой числа строк; - транзакции и MVCC: уровни изоляции (по умолчанию
READ COMMITTED), зачем нуженVACUUMи откуда берётся раздувание таблиц, блокировки иSELECT ... FOR UPDATE; - связка с Python: драйверы
psycopgтретьей версии илиasyncpg, SQLAlchemy 2.0 и её сессии, проблема N+1 и её решение черезselectinload, пул соединений и PgBouncer, миграции через Alembic; - эксплуатация:
pg_dumpи восстановление, репликация, роли и права, если приходилось.
Затем приведите один конкретный случай: какой запрос тормозил, что показал план, что вы поменяли и насколько ускорилось. Цифры должны быть вашими. Если опыт ограничен ORM, скажите честно и покажите, что понимаете, какой SQL генерирует ORM и как это проверить, например включив логирование запросов.
Где спотыкаются
Отвечают «уверенный пользователь» или «три года опыта» без содержания. Стаж ничего не говорит о глубине.
Путают EXPLAIN и EXPLAIN ANALYZE: второй реально выполняет запрос, поэтому для UPDATE или DELETE его запускают только внутри транзакции с последующим ROLLBACK.
Считают, что удалённые строки сразу освобождают место. В PostgreSQL удаление оставляет мёртвые версии строк, обычный VACUUM отдаёт их место под повторное использование, а сжать таблицу целиком может VACUUM FULL, который блокирует её на всё время работы.