Вопрос проверяет умение находить проблемные SQL-запросы и анализировать производительность базы данных.
Чтобы найти узкий SQL-запрос, смотрят на самые медленные и самые часто выполняемые запросы. Для этого используют встроенные инструменты PostgreSQL и логи. После этого анализируют план выполнения запроса. Обычно проблема связана с отсутствием индексов, большим объемом данных или неэффективной логикой запроса.
Чтобы определить, какой SQL-запрос тормозит систему, важно действовать последовательно и опираться на измерения, а не на догадки.
Для начала нужно понять, какие запросы реально нагружают систему.
Статистика выполнения запросов
Используется расширение pg_stat_statements
Позволяет увидеть:
общее время выполнения
среднее время
количество вызовов
Часто узким местом является не самый медленный запрос, а тот, который выполняется тысячи раз
Логи медленных запросов
Включается параметр log_min_duration_statement
Позволяет логировать запросы, которые выполняются дольше заданного порога
Полезно для поиска редких, но очень тяжелых операций
Когда подозрительный запрос найден, его нужно разобрать.
План выполнения
Используется EXPLAIN или EXPLAIN ANALYZE
Показывает:
какие операции выполняются
в каком порядке
сколько строк ожидается и реально обрабатывается
EXPLAIN ANALYZE
SELECT *
FROM orders
WHERE user_id = 42;
На что обращать внимание
Seq Scan на больших таблицах
большое расхождение между rows и actual rows
дорогие операции Sort, Hash, Nested Loop
отсутствие или неправильный индекс
устаревшая статистика
выборка слишком большого количества данных
выполнение запроса в цикле на уровне приложения
Узкий SQL-запрос находят через статистику и логи, а затем анализируют его план выполнения, чтобы понять реальную причину низкой производительности.