Часто производительность падает из-за накопления устаревших (dead) кортежей, которые остаются после
UPDATE/DELETE до следующего VACUUM.Посмотреть их реальный объём можно напрямую из системной статистики:
SELECT relname,
n_dead_tup,
n_live_tup
FROM pg_stat_all_tables
WHERE relname = 'orders';
n_dead_tup — количество устаревших кортежей, n_live_tup — актуальные строки.Чтобы быстро найти самые “раздутые” таблицы, отсортируем по dead-tup:
SELECT relname, n_dead_tup
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC
LIMIT 10;
Хотите оценить степень фрагментации? Сравните dead/live в процентах:
SELECT relname,
n_dead_tup,
n_live_tup,
round(100.0 * n_dead_tup / (n_live_tup + 1), 2) AS dead_ratio
FROM pg_stat_all_tables;
🔥 Это позволяет быстро увидеть, где появляются накладные расходы на I/O и почему планы запроса деградируют.
➡️ SQL Ready | #совет
