Какие SQL запросы вы писали
Что проверяют
Реальный уровень работы с базой, а не знание синтаксиса. Дальше всегда идёт продолжение: покажите самый сложный запрос и расскажите, как ускоряли. Там и видно, писали ли вы SQL руками и читаете ли планы, или только дёргали ORM.
Как отвечать
Не перечисляйте конструкции списком, идите от задачи: какие данные, что считали, чем первый вариант оказался плох, что сделали. По существу стоит назвать:
- джоины и агрегаты:
LEFT JOINсGROUP BYиHAVING, разницаCOUNT(*)иCOUNT(col)наNULL; - оконные функции:
row_number() over (partition by user_id order by created_at desc)для последней записи на пользователя,sum() overдля накопительных итогов; - CTE: читаемость и рекурсивный обход дерева. В PostgreSQL с версии 12 обычный CTE инлайнится в запрос, а
MATERIALIZEDпишется явно; - upsert:
INSERT ... ON CONFLICT (id) DO UPDATEдля идемпотентной записи; - конкурентный доступ:
SELECT ... FOR UPDATE SKIP LOCKEDдля очереди задач в таблице, уровни изоляции,Read Committedпо умолчанию.
Про оптимизацию: EXPLAIN (ANALYZE, BUFFERS) и умение прочитать план (Seq Scan против Index Scan, расхождение оценки строк с фактом), составной индекс и порядок колонок в нём, частичный индекс where is_active, покрывающий с INCLUDE, пагинация по ключу where (created_at, id) < (...) вместо OFFSET 100000.
Если позиция на Go, добавьте про доступ: параметры только плейсхолдерами ($1), никакой склейки строк; context с таймаутом в каждый вызов; defer rows.Close() и проверка rows.Err(); pgx там, где нужны типы PostgreSQL и CopyFrom для пакетной вставки; sqlc генерирует типизированный код по вашим запросам.
Где спотыкаются
Отвечают «писал селекты с джойнами» и замолкают. Молчание читается как отсутствие практики: готовьте один запрос, который разберёте по строкам.
Не могут объяснить, почему индекс не используется. Частые причины: функция или приведение типа над колонкой, лидирующий процент в LIKE, неудачный порядок колонок в составном индексе.
Называют ORM вместо запросов и не знают, какой SQL она сгенерировала. Классика это N+1: сто запросов вместо одного джоина, и видно это только в логе базы.