Какие оптимизации запросов с PostgreSQL вы делали
Что проверяют
Есть ли у вас история, где медленный запрос нашли, поняли причину по плану и исправили с измеримым результатом. Перечисление «индексы, нормализация, work_mem» опыта не показывает. Следом просят показать план и объяснить выбор планировщика.
Как отвечать
Возьмите один-два случая из своего проекта по схеме «симптом, диагностика, исправление, результат». Цифры только свои: время запроса до и после, p95 ручки, нагрузка на базу. Типовые находки для опоры:
- поиск:
pg_stat_statementsпо суммарному времени,auto_explainдля медленных запросов, затемEXPLAIN (ANALYZE, BUFFERS). Смотрите на Seq Scan по большой таблице, расхождение ожидаемых и реальных строк, сортировку с выходом на диск; - индексы: составной под фильтр и сортировку с правильным порядком колонок, частичный
WHERE deleted_at IS NULL, покрывающий черезINCLUDEдля Index Only Scan, индекс по выражению дляlower(email); - пагинация:
OFFSET 100000заменить на keysetWHERE (created_at, id) < ($1, $2) ORDER BY created_at DESC, id DESC LIMIT 50; - N+1 в Go-коде: цикл с запросом на каждую запись свернуть в один запрос с
WHERE id = ANY($1),JOINили пачку черезpgx.Batch; - массовая запись:
CopyFromв pgx вместо тысячINSERT; - соединения: размер
pgxpool, таймауты черезcontext.WithTimeoutиstatement_timeout, чтобы зависший запрос не держал соединение.
Если оптимизацией не занимались, скажите прямо и разберите вслух, как бы действовали с медленным запросом. Порядок диагностики ценнее выдуманной истории.
Где спотыкаются
Говорят «добавил индекс, стало быстрее» без плана. Без EXPLAIN ANALYZE непонятно, используется ли индекс вообще.
Повторяют, что CTE всегда барьер оптимизации. С PostgreSQL 12 CTE без побочных эффектов, на которые ссылаются один раз, встраиваются в запрос, а барьер включается явно через MATERIALIZED.
Забывают про PgBouncer в режиме transaction. pgx по умолчанию кеширует подготовленные выражения, и без их поддержки на стороне пулера или смены QueryExecMode запросы падают с ошибкой о несуществующем prepared statement.