pg_stat_statements: ищем дорогие запросы по общей стоимости

2 мин чтения

Почему стоит смотреть на суммарное время запросов и как pg_stat_statements помогает выбрать, что оптимизировать первым.

Какие запросы исследовать первыми
  1. Суммарное времяИщем наибольший общий вклад в нагрузку
  2. Число вызововОтделяем частые запросы от редких тяжёлых
  3. План и измерениеПроверяем кандидата до и после изменения

Один запрос выполняется десять секунд — его трудно не заметить. Но тысячи коротких запросов могут отнять у сервера гораздо больше времени. pg_stat_statements собирает похожие SQL-запросы в группы и показывает их общий вклад в нагрузку. С него удобно начать, когда тормозит приложение, а явного виновника пока нет.

Подготовка на отдельном стенде

Модуль добавляют в shared_preload_libraries с сохранением других уже настроенных библиотек. Для изменения этого параметра нужен перезапуск сервера. После этого расширение создают в нужной базе. Доступность модуля зависит и от установленного пакета PostgreSQL.

CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
SELECT calls, total_exec_time, mean_exec_time, rows,
       left(query, 160) AS query_sample
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 10;

SQL рассчитан на уже подготовленный сервер. Для просмотра текстов чужих запросов требуются соответствующие права. Не публикуйте выгрузку статистики без проверки: в ней может содержаться чувствительная информация о структуре приложения и запросах.

Читаем показатели вместе

Суммарное время помогает найти общий вклад запроса. Среднее показывает типичную цену вызова, а calls — частоту. Большое среднее при одном запуске и небольшое среднее при миллионе запусков требуют разных решений. Нормализация объединяет похожие формы запросов, поэтому проблемное значение параметра может потребовать отдельного изучения.

Сравниваем одинаковые периоды

Запишите период накопления статистики и изменения нагрузки. Не сравнивайте абсолютные суммы за час и за неделю. Для выбранного запроса проверьте план на характерных параметрах, а затем повторите измерение после одного изменения: SQL, индекса или количества обращений.

Не сбрасывайте статистику без предупреждения: ей могут пользоваться коллеги. Найдя дорогую группу запросов, выясните, какой экран или операция её вызывает. После правки сравните время этой операции целиком — ускорение одного SQL может оказаться незаметным для пользователя.

Источники и дальнейшее чтение