Чтобы найти топ-100 самых долгих запросов в PostgreSQL, можно воспользоваться системными представлениями pg_stat_statements
или pg_stat_activity
.
Способ 1: Использование pg_stat_statements
(Рекомендуется)
Если в PostgreSQL включен модуль pg_stat_statements
, то можно выполнить следующий SQL-запрос:
postgresql
SELECT query, calls, total_time, mean_time, max_time FROM pg_stat_statements ORDER BY total_time DESC LIMIT 100;
Что делает этот запрос?
- Показывает 100 самых долгих запросов по суммарному времени выполнения (
total_time
). mean_time
– среднее время выполнения.max_time
– самое долгое выполнение.calls
– сколько раз запрос выполнялся.
Способ 2: Мониторинг текущих долгих запросов (pg_stat_activity
)
Если pg_stat_statements
не включен, можно посмотреть активные запросы, которые выполняются прямо сейчас:
postgresql
SELECT pid, age(clock_timestamp(), query_start) AS duration, state, query FROM pg_stat_activity WHERE state != 'idle' ORDER BY duration DESC LIMIT 100;
Этот запрос показывает:
- Запросы, которые прямо сейчас выполняются дольше всего.
duration
– время выполнения запроса.state
– статус запроса (например,active
илиidle in transaction
).
Как включить pg_stat_statements
, если он отключен?
Если первый запрос не работает, то нужно включить расширение:
postgresql
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
А затем добавить в postgresql.conf
:
postgresql
shared_preload_libraries = 'pg_stat_statements' pg_stat_statements.track = all
После этого нужно перезапустить PostgreSQL.
Дополнительная информация:
- Если база загружена, можно искать конкретные запросы, которые идут больше 10 секунд:postgresql
SELECT pid, query, now() - query_start AS duration FROM pg_stat_activity WHERE state = 'active' AND now() - query_start > interval '10 seconds' ORDER BY duration DESC;
- Чтобы сбросить статистику
pg_stat_statements
:postgresqlSELECT pg_stat_statements_reset();