Noções Básicas de Estatísticas
O PostgreSQL armazena histogramas de colunas e contagens de valores distintos no catálogo. O planejador multiplica as seletividades para adivinhar quantas linhas cada nó de plano processará no PostgreSQL 18.4.
Receita
Cartão de referência rápida - pronto para copiar e colar.
SELECT schemaname, tablename, attname, n_distinct, most_common_vals, histogram_bounds
FROM pg_stats
WHERE tablename = 'orders' AND attname = 'status';Quando usar isso: As estimativas de linha do EXPLAIN divergem das linhas reais em varreduras filtradas ou junções.
Exemplo de Trabalho
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');O que isso demonstra:
most_common_valspara enums com distribuição enviesada (skewed)n_distinctpara dicas de cardinalidade- Vinculando o conteúdo de
pg_statsàs estimativas de linha do plano
Mergulho Profundo
Como Funciona
ANALYZEamostra linhas (o padrãodefault_statistics_target= 100) e constrói estatísticas por coluna.- A seletividade de igualdade usa
1/n_distinctou a frequência MCV quando o literal aparece emmost_common_vals. - Predicados de intervalo usam
histogram_boundspara distribuições não uniformes. - Múltiplos predicados em colunas independentes multiplicam as seletividades, a menos que estatísticas estendidas digam o contrário.
Principais Views de Catálogo
| Fonte | Mostra |
|---|---|
pg_stats | Histogramas, listas MCV, fração de nulos |
pg_stat_user_tables | last_analyze, tuplas vivas/mortas |
pg_class.reltuples | Estimativa de linha em nível de tabela |
Notas SQL
ALTER TABLE orders ALTER COLUMN status SET STATISTICS 500;
ANALYZE orders (status);Armadilhas
- Assumindo distribuição uniforme - Sem MCV/histograma, o planejador adivinha mal em colunas de status com distribuição enviesada. Correção: Alvo de estatísticas mais alto ou estatísticas estendidas.
- Estatísticas em tabelas vazias - As estimativas padrão enganam até o primeiro
ANALYZEsignificativo. Correção: Analisar após limiares de carga inicial. - Predicados de expressão sem estatísticas -
WHERE lower(email) = 'x'ignora estatísticas de coluna simples. Correção: Índice em expressão ou estatísticas estendidas na expressão. - Colunas AND correlacionadas -
country+postal_codemultiplicam incorretamente. Correção:CREATE STATISTICS ... dependencies. - Nunca analisar após um grande DELETE -
reltuplesdesatualizado por dias. Correção:ANALYZEmanual após DML em massa.
Alternativas
| Alternativa | Usar Quando | Não Usar Quando |
|---|---|---|
| Índice parcial | Predicado seletivo estável | Predicado varia por usuário |
| Particionamento de tabela | Particionamento por tempo/inquilino | Tabela pequena única |
| Contagens materializadas | Denominadores de painel | Necessidade em tempo real |
FAQs
O que é default_statistics_target?
Controla o detalhe do histograma e a contagem de MCV. Mais alto significa análise mais lenta, melhores planos em distribuições enviesadas.
Com que frequência as estatísticas são atualizadas?
O Autovacuum aciona o autoanalyze com base em limiares de alteração. Cargas em massa exigem análise manual.
O que significa n_distinct negativo?
Valores negativos são frações do tamanho da tabela (estimador de distinto escalado do PostgreSQL).
Posso ver estatísticas para índices?
Sim, via pg_stats em colunas indexadas e pg_stat_user_indexes para uso, não histogramas.
Impacto da fração de nulos?
A seletividade IS NULL usa null_frac de pg_stats.
Estatísticas em tabelas particionadas?
Estatísticas por partição são importantes; o planejador combina limites de partição e estatísticas locais.
Viés de amostragem?
Tabelas muito pequenas são analisadas completamente; tabelas grandes são amostradas. Mudanças repentinas na forma dos dados exigem reanálise.
Tipos de estatísticas de correlação?
dependencies, ndistinct, mcv - tipos de estatísticas estendidas cobrem diferentes padrões de correlação.
Segurança em pg_stats?
Legível por padrão; distribuições de dados sensíveis podem vazar. Restrinja as funções, se necessário.
Próxima página?
ANALYZE e autoanalyze para cadência operacional.
Relacionado
- ANALYZE e Autoanalyze - Tempo de atualização
- Estatísticas Estendidas - Colunas correlacionadas
- Estudos de Caso de Planos Ruins - Desvio de estimativa
- GUCs do Planejador - Botões de custo
Versões da Pilha: Esta página foi escrita para PostgreSQL 18.4 (estável 18, manutenção 17), pgvector 0.8+, PgBouncer 1.x, Patroni 3.x e PostGIS 3.5+.