DBAtlas · Atlas de operaciones de bases de datos

Encontrar tablas con estadísticas obsoletas (estrategia de ANALYZE)

PostgreSQLMantenimiento

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;

Qué hace

Muestra el número de filas modificadas desde el último ANALYZE, su proporción respecto a las filas vivas y el umbral aproximado de modificaciones con el que autovacuum disparará ANALYZE.

Cuándo usarlo

Tras cargas/borrados masivos, cuando los planes muestran estimaciones de filas erróneas, o cuando se sospecha que autoanalyze se queda atrás en tablas grandes.

Precaución

El umbral calculado usa los ajustes globales; si existen reloptions autovacuum_analyze_* específicas de la tabla (pg_class.reloptions), el umbral real es distinto. En tablas grandes el scale_factor por defecto (0.1) se dispara demasiado tarde; redúzcalo por tabla. Autovacuum no hace ANALYZE del padre de una tabla particionada; las estadísticas a nivel del padre necesitan un ANALYZE manual. Autovacuum nunca ve las tablas temporales. ANALYZE lee una muestra y toma ShareUpdateExclusiveLock (no bloquea el DML).

Abrir en DBAtlas →

Relacionado