С чего мы обычно начинаем, когда речь заходит об оптимизации PostgreSQL? Конечно, первым делом включаем pg_stat_statements и смотрим, что он нам покажет. Это расширение — наш главный помощник, оно бережно собирает статистику по каждому запросу, который выполняется: сколько раз его вызывали, сколько суммарно и в среднем времени он «съел», и как сильно нагрузил I/O. Поверьте мне, без этих точных цифр любая оптимизация — это просто гадание на кофейной гуще, и мы такого не любим.
-- Включаем pg_stat_statements (если ещё не включено)
-- postgresql.conf:
-- shared_preload_libraries = 'pg_stat_statements'
-- pg_stat_statements.track = all
CREATE EXTENSION IF NOT EXISTS pg_stat_statements;
-- Топ-20 самых тяжёлых запросов по суммарному времени
SELECT
round(total_exec_time::numeric, 2) AS total_time_ms,
calls,
round(mean_exec_time::numeric, 2) AS avg_time_ms,
round((100 * total_exec_time /
sum(total_exec_time) OVER ())::numeric, 2) AS percent_total,
left(query, 120) AS query_preview
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;
Результат нас поразил. Три запроса потребляли 72% всего времени базы данных:
| Запрос | Вызовов/час | Среднее время | % от общего |
|---|---|---|---|
| Поиск товаров с фильтрами | 45 000 | 380 мс | 38% |
| Подсчёт остатков на складах | 12 000 | 920 мс | 22% |
| Формирование ленты товаров | 85 000 | 85 мс | 12% |

Оставить комментарий