Как оцениваешь свой уровень владения SQL?
Что проверяют
Знаете ли вы SQL за пределами ORM и понимаете ли, какие запросы генерирует ваш код. Бэкенд-разработчику на Python нужно замечать N+1, читать план запроса и понимать транзакции. Следом обычно дают задачу на оконную функцию или просят разобрать медленный запрос.
Как отвечать
Разложите самооценку по уровням и честно отметьте, где вы:
- база:
JOINвсех видов,GROUP BYиHAVING, подзапросы, CTE, поведениеNULL; - аналитика: оконные функции
ROW_NUMBER(),LAG(),SUM() OVER (PARTITION BY ...); - производительность:
EXPLAIN ANALYZEв PostgreSQL, отличиеSeq ScanотIndex Scan, составные и частичные индексы, почему функция над колонкой не даёт использовать обычный индекс; - транзакции: уровни изоляции (в PostgreSQL по умолчанию
READ COMMITTED), блокировки,SELECT ... FOR UPDATE; - связка с Python: N+1 в Django лечится
select_relatedиprefetch_related, в SQLAlchemy 2.0 черезselectinloadиjoinedload; сырые запросы только с параметрами, без склейки строк; миграции через Alembic или встроенные миграции Django.
Пример формулировки: «Уверенно пишу сложные выборки и оконные функции, разбираю планы, ловлю N+1 через логирование запросов. Слабее в тюнинге самой СУБД и секционировании». Подставьте свой опыт и одну историю, где вы нашли медленный запрос и что именно изменили.
Где спотыкаются
Знают только ORM. На вопрос «какой SQL сгенерирует этот queryset» отвечают молчанием, хотя str(qs.query) в Django или echo=True в SQLAlchemy показывают его сразу.
Лечат любой медленный запрос индексом на каждую колонку. Индексы замедляют запись, а без EXPLAIN непонятно, поможет ли индекс вообще.
Говорят «ускорил на 30% индексами», но не могут показать, какой был план до и после. Цифра без метода измерения работает против вас.