Ответ
Существует несколько эффективных подходов для выявления и анализа медленных запросов в PostgreSQL. Обычно их комбинируют для получения полной картины.
1. Расширение pg_stat_statements
Это самый популярный способ для анализа производительности запросов в целом. Расширение отслеживает статистику по всем выполненным запросам.
- Установка: В
postgresql.conf
добавьтеshared_preload_libraries = 'pg_stat_statements'
, перезапустите сервер и выполнитеCREATE EXTENSION pg_stat_statements;
. - Использование:
SELECT
(total_exec_time / 1000 / 60) as total_min, -- Общее время выполнения в минутах
mean_exec_time, -- Среднее время выполнения
calls, -- Количество вызовов
query -- Текст запроса
FROM pg_stat_statements
ORDER BY mean_exec_time DESC -- Сортируем по среднему времени
LIMIT 20; -- Показываем топ-20 медленных
2. Логирование медленных запросов
Можно настроить PostgreSQL на запись в лог всех запросов, которые выполняются дольше указанного времени.
- Настройка (в
postgresql.conf
):# Логировать запросы, выполняющиеся дольше 500 миллисекунд
log_min_duration_statement = 500 - Преимущество: Позволяет отловить конкретные медленные выполнения запроса с точными параметрами, которые к этому привели.
3. EXPLAIN ANALYZE
Это основной инструмент для детального анализа конкретного запроса. Он не только показывает план выполнения, но и реально выполняет запрос, отображая фактическое время и количество строк на каждом шаге.
- Использование:
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
- На что смотреть в выводе:
Seq Scan
(полное сканирование таблицы) на больших таблицах — часто признак отсутствия нужного индекса.cost
— оценка стоимости операции (чем выше, тем хуже).actual time
— реальное время выполнения шага.
4. Внешние инструменты
- pgBadger: Мощный анализатор логов PostgreSQL, который генерирует подробные HTML-отчеты.
- Системы мониторинга: Инструменты вроде Prometheus (с
pg_exporter
), Datadog, New Relic предоставляют дашборды для отслеживания производительности БД в реальном времени.