Найти таблицы с устаревшей статистикой (стратегия ANALYZE)
PostgreSQLОбслуживаниеКоманда
SELECT schemaname,
relname AS table_name,
n_live_tup,
n_mod_since_analyze,
round(100.0 * n_mod_since_analyze / NULLIF(n_live_tup, 0), 1) AS mod_pct,
greatest(last_analyze, last_autoanalyze) AS last_analyzed,
round(current_setting('autovacuum_analyze_threshold')::int
+ current_setting('autovacuum_analyze_scale_factor')::numeric * n_live_tup) AS autoanalyze_at
FROM pg_stat_user_tables
WHERE n_mod_since_analyze > 0
ORDER BY mod_pct DESC NULLS LAST
LIMIT 20;
-- After a bulk load, without waiting for autovacuum
ANALYZE (VERBOSE) orders;Что делает
Показывает число строк, изменённых с последнего ANALYZE, его отношение к живым строкам и приблизительный порог изменений, при котором autovacuum запустит ANALYZE.
Когда использовать
После массовых загрузок/удалений, когда планы показывают неверные оценки строк, или при подозрении, что autoanalyze отстаёт на больших таблицах.
Внимание
Вычисленный порог использует глобальные настройки; если существуют reloptions autovacuum_analyze_* для таблицы (pg_class.reloptions), реальный порог отличается. На больших таблицах scale_factor по умолчанию (0.1) срабатывает слишком поздно; снизьте его для таблицы. Autovacuum не выполняет ANALYZE для родительской секционированной таблицы; статистика уровня родителя требует ручного ANALYZE. Временные таблицы autovacuum никогда не видит. ANALYZE читает выборку и берёт ShareUpdateExclusiveLock (не блокирует DML).