SQL

Анализ производительности запроса

Algonexys · 07.08.2026 · 👁 0

EXPLAIN ANALYZE, поиск неиспользуемых индексов и медленных запросов в PostgreSQL.

Код

-- Реальный план выполнения с временем и буферами
EXPLAIN (ANALYZE, BUFFERS, FORMAT TEXT)
SELECT u.username, COUNT(o.id) AS orders
FROM users u
LEFT JOIN orders o ON o.user_id = u.id
WHERE u.created_at >= NOW() - INTERVAL '30 days'
GROUP BY u.username
ORDER BY orders DESC
LIMIT 20;

-- Самые медленные запросы (нужно расширение pg_stat_statements)
SELECT
    ROUND(total_exec_time::numeric, 1) AS total_ms,
    calls,
    ROUND(mean_exec_time::numeric, 2)  AS mean_ms,
    LEFT(query, 120)                   AS query
FROM pg_stat_statements
ORDER BY total_exec_time DESC
LIMIT 20;

-- Индексы, которые никогда не использовались
SELECT relname AS table_name, indexrelname AS index_name,
       pg_size_pretty(pg_relation_size(indexrelid)) AS size
FROM pg_stat_user_indexes
WHERE idx_scan = 0
ORDER BY pg_relation_size(indexrelid) DESC;

-- Размер таблиц с индексами
SELECT relname, pg_size_pretty(pg_total_relation_size(relid)) AS total
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC
LIMIT 10;