DBAtlas · Атлас эксплуатации баз данных

Найти таблицы с устаревшей статистикой (стратегия 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).

Открыть в DBAtlas →

Связанные материалы