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

Criar estatísticas estendidas para colunas correlacionadas (CREATE STATISTICS)

PostgreSQLManutenção

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';

O que faz

Ensina ao planner a correlação entre colunas (dependências funcionais, contagens de distintos combinadas, valores mais comuns conjuntos); corrige as estimativas de linhas para condições WHERE e GROUP BY com várias colunas.

Quando usar

Quando o EXPLAIN ANALYZE mostra linhas estimadas muito abaixo das reais em filtros com várias colunas (ex.: 12 vs. 570) e, por isso, é escolhido um método de join/índice errado.

Atenção

Só tem efeito após o ANALYZE. Quando o número de combinações de colunas é muito maior que o statistics target (padrão 100), a lista mcv não consegue cobrir a maioria delas, e então o mcv pode não corrigir uma estimativa que dependencies corrigiria. Verifique com EXPLAIN; se necessário retire mcv da definição ou aumente o target com ALTER STATISTICS customer_city_district_stx SET STATISTICS 1000;. dependencies só é usado em condições de igualdade/IN, ndistinct nas estimativas de GROUP BY. Toda definição alonga o ANALYZE; adicione-a apenas a grupos de colunas com erro de estimativa comprovado.

Abrir no DBAtlas →

Relacionados