ANALYZE y Autoanalyze
Los workers de Autovacuum ejecutan ANALYZE cuando las tablas cambian lo suficiente. Las cargas masivas de ETL, las migraciones y las tablas "hot" con datos sesgados todavía necesitan un ANALYZE manual en PostgreSQL 18.4 antes de confiar en los nuevos planes.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
ANALYZE VERBOSE orders;
ANALYZE orders (status, created_at);Cuándo usar esto: Después de una carga masiva (COPY), adjuntar una partición, o regresiones de planes en una tabla que "debería" ser analizada automáticamente.
Ejemplo de Trabajo
CREATE TABLE orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
status text NOT NULL,
created_at timestamptz NOT NULL DEFAULT now()
);
INSERT INTO orders (status)
SELECT 'pending' FROM generate_series(1, 500000);
SELECT relname, last_analyze, last_autoanalyze, n_mod_since_analyze
FROM pg_stat_user_tables
WHERE relname = 'orders';
-- Simular umbral: análisis manual después de carga masiva
ANALYZE VERBOSE orders;
EXPLAIN (ANALYZE)
SELECT count(*) FROM orders WHERE status = 'pending';Lo que esto demuestra:
- Monitorización de
n_mod_since_analyze - Análisis manual post-carga
- Estabilidad del plan después de la actualización de estadísticas
Análisis Profundo
Cómo Funciona
- Autoanalyze se activa cuando
n_mod_since_analyzesupera los umbrales de inserción/actualización/eliminación basados enautovacuum_analyze_scale_factor(por defecto 0.1) másautovacuum_analyze_threshold. ANALYZEtoma un bloqueo compartido (share lock); usualmente breve en tablas grandes debido al muestreo.ANALYZE t (col)dirigido a columnas acelera las ejecuciones cuando solo una columna sesgada ha cambiado.VACUUM (ANALYZE)combina la limpieza de visibilidad y las estadísticas (preferir ajuste separado en producción).
Ejemplo de Ajuste de Umbrales
ALTER TABLE orders SET (
autovacuum_analyze_scale_factor = 0.02,
autovacuum_analyze_threshold = 1000
);Cuándo se Requiere un ANALYZE Manual
| Evento | Acción |
|---|---|
COPY / inserción masiva | ANALYZE antes de la evaluación de rendimiento |
| Nuevo índice en tabla enorme | ANALYZE después de CREATE INDEX CONCURRENTLY |
| Adjuntar/desadjuntar partición | Analizar la nueva partición |
| Purga mayor de eliminaciones | ANALYZE en la misma ventana de mantenimiento |
Trampas Comunes
- Desactivar autovacuum para "reducir la carga" - Las estadísticas se degradan junto con la fragmentación (bloat). Solución: Ajustar umbrales por tabla, nunca globalmente desactivado.
- Analizar durante horas pico sin necesidad - Pico de I/O en tablas enormes. Solución: Programar después de ETL; usar listas de columnas.
- Asumir que CREATE INDEX actualiza estadísticas - Las estadísticas de índices son diferentes; las estadísticas de la tabla pueden estar desactualizadas. Solución:
ANALYZEla tabla después de la creación del índice. - Ignorar tablas heredadas - El padre particionado puede necesitar
ANALYZEen los hijos. Solución:ANALYZE ONLYvs comportamiento por defecto según la documentación. - Comparar planes antes del análisis - Falsos negativos en la utilidad del índice. Solución: Estandarizar el análisis en el sistema de pruebas de rendimiento.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
Mayor statistics_target en columnas sesgadas | Predicados de cola larga (heavy-tail) | Todas las columnas ciegamente |
pg_cron para análisis programado | Fin predecible de ETL | Ya cumple con autoanalyze |
| Refresco de instantánea lógica (Logical snapshot refresh) | Tablas derivadas de Data Warehouse | Rutas principales OLTP |
Preguntas Frecuentes
¿ANALYZE vs VACUUM ANALYZE?
VACUUM ANALYZE hace ambas cosas. Para tablas "hot", ajustar vacuum y analyze por separado es más claro.
¿ANALYZE bloquea escrituras?
ShareUpdateExclusiveLock permite lecturas/escrituras; actualizaciones breves del catálogo al final.
¿Cuánto tarda ANALYZE?
Proporcional al objetivo de estadísticas y al tamaño de la tabla; el muestreo lo mantiene sub-lineal.
¿Puedo cancelar ANALYZE?
Sí, a través de pg_cancel_backend. Pueden resultar estadísticas parciales; volver a ejecutar.
¿autovacuum no analiza?
Comprobar log_autovacuum_min_duration, el número de workers y autovacuum_enabled a nivel de tabla.
¿ANALYZE en réplicas?
Las réplicas en espera (standbys) no ejecutan autovacuum/analyze; las estadísticas provienen de la primaria.
¿Tablas externas (Foreign tables)?
Usar ANALYZE en tablas externas cuando el FDW (Foreign Data Wrapper) soporta estadísticas importadas.
¿pg_stat_progress_analyze?
PostgreSQL 18 rastrea las fases de análisis para ejecuciones largas.
¿Después de TRUNCATE?
Las estadísticas se reinician; analizar tablas vacías o con datos recargados.
¿Siguiente?
Estadísticas extendidas cuando ANALYZE por sí solo no corrige las estimaciones.
Relacionado
- Estadísticas Básicas - Qué se recopila
- Estadísticas Extendidas - Más allá de las estadísticas por columna
- Ajuste de Autovacuum - Configuración compartida de workers
- Mejores Prácticas de Estadísticas - Lista de verificación del equipo
Versiones de la Pila: Esta página fue escrita para PostgreSQL 18.4 (estable 18, mantenimiento 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x, y PostGIS 3.5+.