DBAtlas · Atlas de operaciones de bases de datos

Crear estadísticas extendidas para columnas correlacionadas (CREATE STATISTICS)

PostgreSQLMantenimiento

Comando

-- city and district are correlated: the planner assumes independence and underestimates rows
CREATE STATISTICS customer_city_district_stx (dependencies, ndistinct, mcv) ON city, district FROM customer;
ANALYZE customer;

-- Collected statistics
SELECT statistics_name, attnames, kinds, n_distinct, dependencies
FROM pg_stats_ext
WHERE tablename = 'customer';

-- Verify: estimated rows should now be close to actual rows
EXPLAIN (ANALYZE, TIMING OFF)
SELECT * FROM customer WHERE city = 'Ankara' AND district = 'Cankaya';

Qué hace

Enseña al planificador la correlación entre columnas (dependencias funcionales, recuentos distintos combinados, valores más comunes conjuntos); corrige las estimaciones de filas para condiciones WHERE y GROUP BY de varias columnas.

Cuándo usarlo

Cuando EXPLAIN ANALYZE muestra filas estimadas muy por debajo de las reales en filtros de varias columnas (p. ej., 12 frente a 570) y, como consecuencia, se elige un método de join/índice equivocado.

Precaución

Solo surte efecto tras ANALYZE. Cuando el número de combinaciones de columnas está muy por encima del statistics target (100 por defecto), la lista mcv no puede cubrir la mayoría, y entonces mcv puede no corregir una estimación que dependencies sí corregiría. Verifíquelo con EXPLAIN; si es necesario quite mcv de la definición o suba el target con ALTER STATISTICS customer_city_district_stx SET STATISTICS 1000;. dependencies solo se usa en condiciones de igualdad/IN, ndistinct en estimaciones de GROUP BY. Cada definición alarga el ANALYZE; añádala solo a grupos de columnas con un error de estimación demostrado.

Abrir en DBAtlas →

Relacionado