Estadísticas Básicas
PostgreSQL almacena histogramas de columnas y recuentos de valores distintos en el catálogo. El planificador multiplica las selectividades para adivinar cuántas filas procesará cada nodo del plan en PostgreSQL 18.4.
Receta
Tarjeta de referencia rápida - lista para copiar y pegar.
SELECT schemaname, tablename, attname, n_distinct, most_common_vals, histogram_bounds
FROM pg_stats
WHERE tablename = 'orders' AND attname = 'status';Cuándo usar esto: Las estimaciones de filas de EXPLAIN divergen de actual rows en escaneos filtrados o uniones.
Ejemplo de Trabajo
CREATE TABLE orders (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
status text NOT NULL,
customer_id bigint NOT NULL
);
INSERT INTO orders (status, customer_id)
SELECT
CASE WHEN i % 50 = 0 THEN 'shipped' ELSE 'pending' END,
(i % 1000)::bigint
FROM generate_series(1, 100000) AS i;
ANALYZE orders;
EXPLAIN (ANALYZE)
SELECT count(*) FROM orders WHERE status = 'shipped';
SELECT attname, n_distinct, most_common_vals, most_common_freqs
FROM pg_stats
WHERE tablename = 'orders' AND attname IN ('status', 'customer_id');Lo que esto demuestra:
most_common_valspara enums sesgadosn_distinctpara pistas de cardinalidad- Vinculación del contenido de
pg_statscon las estimaciones de filas del plan
Análisis Profundo
Cómo Funciona
ANALYZEtoma muestras de filas (el valor predeterminadodefault_statistics_target= 100) y crea estadísticas por columna.- La selectividad de igualdad utiliza
1/n_distincto la frecuencia de MCV cuando el literal aparece enmost_common_vals. - Los predicados de rango utilizan
histogram_boundspara distribuciones no uniformes. - Múltiples predicados en columnas independientes multiplican las selectividades a menos que las estadísticas extendidas digan lo contrario.
Vistas de Catálogo Clave
| Fuente | Muestra |
|---|---|
pg_stats | Histogramas, listas MCV, fracción de nulos |
pg_stat_user_tables | last_analyze, tuplas vivas/muertas |
pg_class.reltuples | Estimación de filas a nivel de tabla |
Notas SQL
ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
ANALYZE orders (status);Trampas Comunes
- Asumir distribución uniforme - Sin MCV/histograma, el planificador adivina mal en columnas de estado sesgadas. Solución: Mayor objetivo de estadísticas o estadísticas extendidas.
- Estadísticas en tablas vacías - Las estimaciones predeterminadas engañan hasta el primer
ANALYZEsignificativo. Solución: Analizar después de los umbrales de carga inicial. - Predicados de expresión sin estadísticas -
WHERE lower(email) = 'x'ignora las estadísticas de columna simples. Solución: Índice en expresión o estadísticas extendidas en expresión. - Columnas AND correlacionadas -
country+postal_codese multiplican incorrectamente. Solución:CREATE STATISTICS ... dependencies. - Nunca analizar después de un
DELETEgrande -reltuplesobsoleto durante días. Solución:ANALYZEmanual después de DML masivo.
Alternativas
| Alternativa | Usar Cuando | No Usar Cuando |
|---|---|---|
| Índice parcial | Predicado selectivo estable | El predicado varía por usuario |
| Partición de tabla | Partición por tiempo/inquilino | Tabla pequeña única |
| Recuentos materializados | Denominadores de panel | Necesidad en tiempo real |
Preguntas Frecuentes
¿Qué es default_statistics_target?
Controla el detalle del histograma y el recuento de MCV. Un valor más alto ralentiza el análisis, pero mejora los planes en casos de sesgo.
¿Con qué frecuencia se actualizan las estadísticas?
Autovacuum activa el autoanálisis basándose en umbrales de cambio. Las cargas masivas requieren análisis manual.
¿Qué significa un `n_distinct` negativo?
Los valores negativos son fracciones del tamaño de la tabla (estimador de distintos escalado de PostgreSQL).
¿Puedo ver estadísticas para índices?
Sí, a través de pg_stats en columnas indexadas y pg_stat_user_indexes para uso, no histogramas.
¿Impacto de la fracción de nulos?
La selectividad de IS NULL utiliza null_frac de pg_stats.
¿Estadísticas en tablas particionadas?
Las estadísticas por partición son importantes; el planificador combina los límites de partición y las estadísticas locales.
¿Sesgo de muestreo?
Las tablas muy pequeñas se analizan completamente; las tablas grandes se muestrean. Los cambios repentinos en la forma de los datos requieren reanálisis.
Tipos de estadísticas de correlación?
Los tipos de estadísticas extendidas dependencies, ndistinct, mcv cubren diferentes patrones de correlación.
Seguridad en pg_stats?
Legible por defecto; las distribuciones de datos sensibles pueden filtrarse. Restringir roles si es necesario.
¿Página siguiente?
ANALYZE y autoanalyze para la cadencia operativa.
Relacionado
- ANALYZE y Autoanalyze - Momento de actualización
- Estadísticas Extendidas - Columnas correlacionadas
- Estudios de Caso de Planes Malos - Deriva de estimación
- GUCs del Planificador - Perillas de costo
Versiones de Stack: 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+.