You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 4 Next »

Чтобы найти топ-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:
    postgresql
    SELECT pg_stat_statements_reset();                


Данную информацию необходимо будет выгрузить в отдельный файл (.CSV), и передать на анализ
в Отдел сопровождения и внедрения IQStore: support@iqstore.ru

  • No labels