Particionamento e sharding: quando e como
⏱ 14 min·⭐ 60 XP
Pré-requisitos (0/1)0%
- ⬜🔁 Replication: streaming, logical, failover(Database Deep — Postgres Internals)
Recomendamos completar os pré-requisitos antes de seguir, mas nada te impede de continuar.
Partitioning declarativo (PG 10+)
| Estratégia | Divide por | Ganha | Cuidado |
|---|---|---|---|
| Por faixa | Intervalo — normalmente tempo | Descarte de período inteiro em uma operação | Precisa criar a partição futura antes de precisar |
| Por lista | Valor discreto — região, tipo | Consulta que filtra por aquele valor lê uma partição | Valor não previsto precisa de partição padrão |
| Por hash | Espalhamento uniforme | Distribuir escrita | Consulta por faixa passa a ler todas |
| ⚠ Particionar ≠ distribuir | Continua um servidor só | Manutenção e descarte mais baratos | Não resolve limite de máquina — isso é distribuição |
EstratégiaPor faixa
Divide porIntervalo — normalmente tempo
GanhaDescarte de período inteiro em uma operação
CuidadoPrecisa criar a partição futura antes de precisar
EstratégiaPor lista
Divide porValor discreto — região, tipo
GanhaConsulta que filtra por aquele valor lê uma partição
CuidadoValor não previsto precisa de partição padrão
EstratégiaPor hash
Divide porEspalhamento uniforme
GanhaDistribuir escrita
CuidadoConsulta por faixa passa a ler todas
Estratégia⚠ Particionar ≠ distribuir
Divide porContinua um servidor só
GanhaManutenção e descarte mais baratos
CuidadoNão resolve limite de máquina — isso é distribuição
-- RANGE: por mês
CREATE TABLE events (id BIGINT, created_at TIMESTAMP, ...)
PARTITION BY RANGE (created_at);
CREATE TABLE events_2026_01 PARTITION OF events
FOR VALUES FROM ('2026-01-01') TO ('2026-02-01');
CREATE TABLE events_2026_02 PARTITION OF events
FOR VALUES FROM ('2026-02-01') TO ('2026-03-01');
-- pg_partman automatiza creation de novas partitions
CREATE EXTENSION pg_partman;
SELECT partman.create_parent('public.events', 'created_at', 'range', 'monthly');
-- Cleanup instantâneo
DROP TABLE events_2025_01; -- data de 2025 jan some em 50msHASH partition (distribuir writes)
CREATE TABLE users (id BIGINT, ...) PARTITION BY HASH (id);
CREATE TABLE users_0 PARTITION OF users FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE users_1 PARTITION OF users FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE users_2 PARTITION OF users FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE users_3 PARTITION OF users FOR VALUES WITH (MODULUS 4, REMAINDER 3);
-- Inserts distribuem uniformementeQuiz rápido
Qual é a diferença entre particionar uma tabela e distribuir dados entre servidores?
Quando sharding (Citus)
💡
Particionamento: até ~1TB por tabela ou até server max (8TB instance AWS). Sharding: >10TB ou >100k writes/s sustentado. Antes de pegar sharding, verifique: vertical scale esgotado? Cache layer? Read replicas? Sharding é último recurso — complexity cost enorme.
Perguntas frequentes
❓ Qual a diferença entre particionar e fragmentar?
Particionar divide a tabela dentro da mesma instância — resolve gerenciamento e varredura, não capacidade. Fragmentar distribui entre instâncias — resolve capacidade e traz consulta entre nós, transação distribuída e re-equilíbrio. Confundir os dois leva a esperar de particionamento um ganho que ele não dá.
❓ Quando particionar uma tabela?
Quando ela é grande e as consultas filtram por um critério natural — em geral data — e quando descartar dado antigo por partição inteira é operacionalmente valioso. Particionar sem que a consulta filtre pela chave de partição piora: o banco varre todas as partições.
❓ Como escolher a chave de fragmentação?
Pela distribuição uniforme e pelo alinhamento com o acesso: idealmente toda consulta atinge um fragmento só. Chave que obriga a consultar todos os fragmentos anula o ganho e acrescenta latência. É a decisão mais difícil de reverter em toda a arquitetura de dados.
Fixando
Quiz rápido
Qual critério de particionamento é mais comum e por quê?
Quiz rápido
Qual é o maior risco ao escolher a chave de distribuição?
Terminou de ler?
Marcar como concluído registra o XP, mantém sua sequência e coloca 3 cartas deste módulo na fila de revisão espaçada.
Próximos passos sugeridos
Temas deste módulo
Discussão
Carregando comentários…