DBAtlas · Atlas de operações de banco de dados

Encontrar tabelas com estatísticas desatualizadas (estratégia de ANALYZE)

PostgreSQLManutenção

Comando

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;

O que faz

Mostra o número de linhas modificadas desde o último ANALYZE, sua proporção em relação às linhas vivas e o limite aproximado de modificações em que o autovacuum vai disparar o ANALYZE.

Quando usar

Após cargas/exclusões em massa, quando os planos mostram estimativas de linhas erradas ou quando se suspeita que o autoanalyze está atrasado em tabelas grandes.

Atenção

O limite calculado usa as configurações globais; se existirem reloptions autovacuum_analyze_* específicas da tabela (pg_class.reloptions), o limite real é diferente. Em tabelas grandes o scale_factor padrão (0.1) dispara tarde demais; reduza-o por tabela. O autovacuum não faz ANALYZE da tabela pai de uma tabela particionada; as estatísticas em nível de pai precisam de ANALYZE manual. Tabelas temporárias nunca são vistas pelo autovacuum. O ANALYZE lê uma amostra e obtém ShareUpdateExclusiveLock (não bloqueia DML).

Abrir no DBAtlas →

Relacionados