Particionamento por intervalo, lista e hash
Escolha a estratégia de particionamento adequada: intervalo para séries temporais, lista para locatários e hash para distribuição uniforme.
Particionamento por intervalo, lista e hash é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Particionamento por intervalo
Cada partição abrange um intervalo contínuo de valores. É mais comum em séries temporais:
CREATE TABLE events (
id BIGSERIAL,
ts TIMESTAMPTZ NOT NULL,
data JSONB
) PARTITION BY RANGE (ts);
CREATE TABLE events_2024_q1 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2024-04-01');
CREATE TABLE events_2024_q2 PARTITION OF events
FOR VALUES FROM ('2024-04-01') TO ('2024-07-01');Os limites dos intervalos são semiabertos
FROM é inclusivo e TO é exclusivo. Os limites se alinham perfeitamente — sem sobreposições nem lacunas.
Particionamento por lista
Cada partição contém valores específicos:
CREATE TABLE customers (
id BIGSERIAL,
country TEXT NOT NULL,
name TEXT
) PARTITION BY LIST (country);
CREATE TABLE customers_us PARTITION OF customers FOR VALUES IN ('US');
CREATE TABLE customers_eu PARTITION OF customers FOR VALUES IN ('DE','FR','IT','ES','NL');
CREATE TABLE customers_other PARTITION OF customers DEFAULT;Partição DEFAULT
Captura as linhas que não correspondem a nenhuma outra partição. Sem uma partição desse tipo, os INSERTs de linhas sem correspondência falham.
Particionamento por hash
As linhas são distribuídas usando o hash da chave de particionamento. É adequado quando você deseja uma distribuição uniforme, mas não tem um intervalo ou uma lista natural:
CREATE TABLE sessions (
id UUID,
user_id BIGINT,
data JSONB
) PARTITION BY HASH (user_id);
CREATE TABLE sessions_0 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 0);
CREATE TABLE sessions_1 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 1);
CREATE TABLE sessions_2 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 2);
CREATE TABLE sessions_3 PARTITION OF sessions FOR VALUES WITH (MODULUS 4, REMAINDER 3);Escolhendo uma estratégia
- Intervalo — séries temporais e identificadores que crescem monotonamente
- Lista — locatários, países e camadas de alta demanda
- Hash — quando não há uma distribuição natural e você deseja apenas paralelismo
Subparticionamento
As partições também podem ser particionadas (em vários níveis):
CREATE TABLE events_2024 PARTITION OF events
FOR VALUES FROM ('2024-01-01') TO ('2025-01-01')
PARTITION BY HASH (user_id);
-- 2024 is a yearly range partition, internally hashed by user_id.Índices em tabelas particionadas
Os índices da tabela pai são propagados automaticamente para todas as partições. As restrições UNIQUE precisam incluir a chave de particionamento:
CREATE INDEX events_user_idx ON events (user_id);
-- Creates one index per partition automatically.
ALTER TABLE events ADD CONSTRAINT events_uniq UNIQUE (id, ts);
-- ts must be in the constraint because it's the partition key.Chaves primárias e partições
A PRIMARY KEY de uma tabela particionada precisa incluir a coluna de particionamento. Essa é uma restrição fundamental do particionamento declarativo.
Adicionando e removendo partições
Operações baratas:
CREATE TABLE events_2024_q3 PARTITION OF events
FOR VALUES FROM ('2024-07-01') TO ('2024-10-01');
DROP TABLE events_2023_q1;
-- Instant; equivalent to deleting all old data.Criação automática de partições
O PostgreSQL não cria automaticamente as partições futuras. Soluções comuns:
- Extensão pg_partman — partições mensais gerenciadas
- Trabalho agendado que executa CREATE para a próxima partição
Chaves estrangeiras
As chaves estrangeiras para uma tabela particionada precisam do PG 12+. As chaves estrangeiras de uma tabela particionada para uma tabela normal funcionam normalmente.
Resumo
Três estratégias de particionamento abrangem a maioria dos casos.
- Intervalo para tempo e sequências
- Lista para conjuntos discretos
- Hash para distribuição uniforme
- A PK precisa incluir a coluna de particionamento
Verificação rápida
Você deseja particionar uma tabela de sessões por user_id, com distribuição uniforme e sem uma ordenação natural. Qual estratégia deve usar?
Perguntas Frequentes
A aula “Particionamento por intervalo, lista e hash” é grátis?
Sim — o texto completo de “Particionamento por intervalo, lista e hash” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “Particionamento por intervalo, lista e hash”?
Escolha a estratégia de particionamento adequada: intervalo para séries temporais, lista para locatários e hash para distribuição uniforme. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “Particionamento por intervalo, lista e hash”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que particionar: poda e manutenção
- Particionamento por intervalo, lista e hash
- Desanexação e anexação de partições
- Consultas eficientes entre partições