Hash Join frente a Merge Join y Nested Loop
Reconozca las tres estrategias principales de combinación, sus perfiles de coste y cuándo cada una es la mejor opción para el planificador.
Hash Join frente a Merge Join y Nested Loop es una lección gratuita de SQL Academy en CoddyKit. Esta es la lección 3 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de SQL Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de SQL Academy incluye 4 lecciones en total.
Tres estrategias de unión
PostgreSQL tiene tres algoritmos físicos de unión:
- Nested Loop — recorre la parte interna por cada fila externa
- Hash Join — crea un hash de la parte interna y lo consulta con la parte externa
- Merge Join — ordena ambos lados y los combina paso a paso
Nested Loop
Es la estrategia más sencilla: externa × interna. Es rápida cuando la parte interna tiene un buen índice Y la parte externa es pequeña:
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)Cuándo gana Nested Loop
Si la parte externa tiene pocas filas Y la interna tiene un índice sobre la clave de unión, Nested Loop es extremadamente rápido. En el peor caso: O(externa × interna).
Hash Join
Cree una tabla hash con una de las partes, normalmente la más pequeña, y después consúltela con la otra. Es ideal para unir dos tablas grandes cuando no existe un índice útil sobre la clave de unión:
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_bCuándo gana Hash Join
Dos tablas medianas o grandes, sin un índice adecuado sobre la clave de unión, o cuando el planificador necesita muchas filas. Está limitado por la memoria: la tabla hash debe caber en work_mem o se volcará al disco.
Merge Join
Ambos lados están ordenados por la clave de unión y se recorren conjuntamente. Es ideal cuando ambos lados ya están ordenados, por ejemplo, mediante un índice adecuado:
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)Cuándo gana Merge Join
Dos entradas grandes y previamente ordenadas. Recorrido lineal y poco uso de memoria. El coste de ordenación es importante: si hay que ordenar explícitamente ambos lados, normalmente gana hash.
Cómo elegir entre ellas
El planificador decide en función de:
- El número estimado de filas
- Los índices disponibles
- La memoria (
work_mem) - Las constantes de coste de postgresql.conf
Forzar una estrategia (solo para diagnóstico)
Para depurar, puede desactivar estrategias:
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.Volcado al disco
Si la tabla hash o la ordenación supera work_mem, el operador vuelca archivos temporales al disco, lo que es mucho más lento. Aumente work_mem o reescriba la consulta.
Uniones en paralelo
PostgreSQL puede paralelizar Hash Join y Merge Join, además de los recorridos secuenciales y mediante índices. Esto aparece en EXPLAIN como Parallel Hash Join con Workers Planned.
Interpretar la elección
En EXPLAIN ANALYZE, el nombre del nodo de unión le indica la estrategia. Casi siempre la elección es correcta; cuando no lo sea, revise primero las estadísticas y los índices antes de forzar una estrategia.
Resumen
Las tres estrategias de unión se adaptan a distintas situaciones.
- Nested Loop: parte externa pequeña y parte interna indexada
- Hash: tablas grandes sin un índice útil
- Merge: entradas previamente ordenadas
Comprobación rápida
Va a unir dos tablas de 10 millones de filas mediante una columna sin índice. ¿Qué algoritmo de unión es probable que elija el planificador?
Preguntas frecuentes
¿La lección «Hash Join frente a Merge Join y Nested Loop» es gratis?
Sí — el texto completo de «Hash Join frente a Merge Join y Nested Loop» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de SQL Academy, actualiza a CoddyKit PRO. El curso de SQL Academy incluye 4 lecciones en total.
¿Qué aprenderé en «Hash Join frente a Merge Join y Nested Loop»?
Reconozca las tres estrategias principales de combinación, sus perfiles de coste y cuándo cada una es la mejor opción para el planificador. Practicas SQL Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.
¿Necesito experiencia previa para empezar SQL Academy?
No se requiere experiencia previa. SQL Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 3 de 4.
¿Cuánto tiempo toma la lección «Hash Join frente a Merge Join y Nested Loop»?
La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.
¿Puedo escribir y ejecutar código en esta lección de SQL Academy?
Sí. Cada lección de SQL Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.
Todas las lecciones de este curso
- Interpretación de EXPLAIN y EXPLAIN ANALYZE
- Escaneos secuenciales frente a escaneos mediante índices
- Hash Join frente a Merge Join y Nested Loop
- Identificación y corrección de consultas lentas