Junção por hash vs junção por intercalação vs loop aninhado
Reconheça as três principais estratégias de junção, seus perfis de custo e quando cada uma é a melhor escolha do planejador.
Junção por hash vs junção por intercalação vs loop aninhado é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 3 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.
Três Estratégias de Junção
PostgreSQL tem três algoritmos físicos de junção:
- Junção aninhada — para cada linha externa, faz a varredura da parte interna
- Junção por hash — cria um hash da parte interna e consulta-o com a parte externa
- Junção por mesclagem — ordena ambos os lados e os mescla em paralelo
Junção Aninhada
A mais simples: parte externa × parte interna. É rápida quando a parte interna tem um bom índice E a parte externa é pequena:
EXPLAIN ANALYZE
SELECT * FROM users u JOIN orders o ON o.user_id = u.id
WHERE u.id = 42;
-- Nested Loop
-- -> Index Scan on users where id = 42 (rows=1)
-- -> Index Scan on orders_user_id_idx (rows=5)Quando a Junção Aninhada Vence
Se o lado externo tem poucas linhas E o lado interno tem um índice na chave de junção, a junção aninhada é extremamente rápida. Pior caso: O(externa × interna).
Junção por Hash
Cria uma tabela hash em um dos lados (geralmente o menor) e depois consulta-a com o outro. É excelente para unir duas tabelas grandes quando não existe um índice útil na chave de junção:
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key;
-- Hash Join (cost=10000..50000)
-- -> Seq Scan on big_a
-- -> Hash
-- -> Seq Scan on big_bQuando a Junção por Hash Vence
Duas tabelas médias ou grandes, sem um bom índice na chave de junção, ou quando o planejador precisa de muitas linhas. Limitada pela memória: a tabela hash precisa caber em work_mem ou será transferida para o disco.
Junção por Mesclagem
Ambos os lados são ordenados pela chave de junção e percorridos juntos. É excelente quando os dois lados já estão ordenados (por exemplo, por um índice compatível):
EXPLAIN ANALYZE
SELECT * FROM big_a a JOIN big_b b ON a.key = b.key
ORDER BY a.key;
-- Merge Join
-- -> Index Scan on big_a (a.key ASC)
-- -> Index Scan on big_b (b.key ASC)Quando a Junção por Mesclagem Vence
Duas entradas grandes e previamente ordenadas. Varredura linear, pouca memória. O custo da ordenação é importante — se ambos os lados precisarem de ordenação explícita, a junção por hash geralmente vence.
Escolhendo entre Elas
O planejador escolhe com base em:
- Quantidades estimadas de linhas
- Índices disponíveis
- Memória (
work_mem) - Constantes de custo em postgresql.conf
Forçando uma Estratégia Apenas para Diagnóstico
Para depuração, você pode desabilitar estratégias:
SET enable_hashjoin = off;
SET enable_mergejoin = off;
SET enable_nestloop = off;
-- Re-run EXPLAIN to see what the planner picks instead.
-- NEVER persist these in production.Transferência para o Disco
Se a tabela hash ou a ordenação exceder work_mem, o operador transfere arquivos temporários para o disco — muito mais lentamente. Aumente work_mem ou reescreva a consulta.
Junções Paralelas
PostgreSQL pode paralelizar a junção por hash e a junção por mesclagem (além de varreduras sequenciais e de índice) — isso aparece como Parallel Hash Join com Workers Planned em EXPLAIN.
Interpretando a Escolha
Em EXPLAIN ANALYZE, o nome do nó de junção informa a estratégia. A escolha quase sempre é correta — quando não for, concentre-se nas estatísticas e nos índices antes de forçar estratégias.
Recapitulação
As três estratégias de junção atendem a diferentes formatos.
- Junção aninhada: parte externa pequena + parte interna indexada
- Hash: tabelas grandes, sem índice útil
- Mesclagem: entradas previamente ordenadas
Verificação Rápida
Você está unindo duas tabelas com 10 milhões de linhas por uma coluna sem índice. Qual algoritmo de junção o planejador provavelmente escolherá?
Perguntas Frequentes
A aula “Junção por hash vs junção por intercalação vs loop aninhado” é grátis?
Sim — o texto completo de “Junção por hash vs junção por intercalação vs loop aninhado” é 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 “Junção por hash vs junção por intercalação vs loop aninhado”?
Reconheça as três principais estratégias de junção, seus perfis de custo e quando cada uma é a melhor escolha do planejador. 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 3 de 4.
Quanto tempo leva a aula “Junção por hash vs junção por intercalação vs loop aninhado”?
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
- Lendo EXPLAIN e EXPLAIN ANALYZE
- Varreduras sequenciais vs varreduras por índice
- Junção por hash vs junção por intercalação vs loop aninhado
- Identificação e correção de consultas lentas