Как быстро найти “тяжёлые” запросы в PostgreSQL

GuDron

dumpz.ws
Admin
Регистрация
28 Янв 2020
Сообщения
9,534
Реакции
1,550
Credits
33,516
Как быстро найти “тяжёлые” запросы в PostgreSQL

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

Используем pg_stat_activity и pg_stat_statements. Но сначала убедись, что pg_stat_statements включён:
SQL:
-- Проверка:
SELECT * FROM pg_extension WHERE extname = 'pg_stat_statements';

-- Включение (если не установлен):
CREATE EXTENSION pg_stat_statements;

Теперь сам запрос на поиск “тяжёлых” запросов:
SQL:
SELECT
  query,
  calls,
  total_exec_time,
  mean_exec_time,
  rows
FROM
  pg_stat_statements
ORDER BY
  total_exec_time DESC
LIMIT 5;

А если интересует то, что прямо сейчас выполняется — тогда так:
SQL:
SELECT
  pid,
  now() - query_start AS duration,
  state,
  query
FROM
  pg_stat_activity
WHERE
  state != 'idle'
ORDER BY
  duration DESC;

Можно сохранять эти запросы в отдельный .sql-файл, чтобы запускать сразу при проблемах с производительностью. Полезно добавить в .psqlrc алиас или даже обернуть в скрипт.