Простой, но крайне полезный приём, как находить “тяжёлые” запросы в PostgreSQL, которые тормозят базу.

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,388
Реакции
1,547
Credits
32,800
Простой, но крайне полезный приём, как находить “тяжёлые” запросы в PostgreSQL, которые тормозят базу.

Если у вас база под нагрузкой, и “что-то всё стало медленно”, первым делом проверьте:
SQL:
SELECT pid, now() - query_start AS duration, query
FROM pg_stat_activity
WHERE state = 'active'
ORDER BY duration DESC
LIMIT 5;
Этот запрос показывает топ-5 самых долгих активных запросов. Обратите внимание на query_start — именно он поможет понять, кто завис и тормозит остальных.

А если хотите посмотреть историю медленных запросов за последние часы/дни — подключайте pg_stat_statements:
SQL:
SELECT

  calls,

  total_time,

  mean_time,

  query

FROM pg_stat_statements

ORDER BY total_time DESC

LIMIT 10;
Тут видно, какие запросы в сумме "съели" больше всего времени. И это гораздо честнее, чем смотреть только на mean_time или calls по отдельности.

Совет:
подключите pg_stat_statements на проде и делайте такой анализ хотя бы раз в неделю. Это поможет находить проблемные места в приложении до того, как начнётся пожар.