de Martin LE TARNEC.

La operación de unión (join)


Una sentencia SQL camina hacia un restaurante y ve dos tablas.
Se acerca a ellas y les pregunta: “¿Puedo unirme a ustedes?”

— Fuente: desconocida

La operación de unión (en inglés join) transforma los datos desde un modelo normalizado hacia una forma no normalizada que se ajusta a un objetivo específico de procesamiento. La unión es muy sensible a la diferencia entre minúsculas y mayúsculas para los tiempos de búsqueda porque fusiona fragmentos de datos aislados. Indexar correctamente es nuevamente la mejor solución para reducir los tiempos de respuesta. El índice correcto depende sin embargo de los tres algoritmos de uniones posibles usados por la sentencia.

Pero existe una cosa que es común a todos los algoritmos de unión: procesan solamente dos tablas al mismo tiempo. Una sentencia SQL con más tablas requiere múltiples etapas: primero, construir un resultado intermedio uniendo dos tablas; y, después, unir el resultado con la siguiente tabla y así sucesivamente.

Conectando los resultados intermedios

Aunque el concepto de resultados intermedios permite explicar muy bien el algoritmo, eso no significa que la base de datos tenga que materializarlo. Esto significaría tener que almacenar el resultado intermedio de la primera unión antes de empezar el siguiente. Pero las bases de datos usan tuberías para reducir el uso de memoria. Eso significa que cada registro desde el resultado intermedio es transportado de inmediato hacia la siguiente operación de unión, lo que evita la necesidad de almacenar el resultado intermedio.

Aunque el orden de la unión no tiene impacto sobre el resultado final, afecta al rendimiento. Por lo tanto, el optimizador evaluará todas las combinaciones de orden posibles de la unión y seleccionará la mejor. Eso significa que el mero hecho de optimizar una sentencia compleja podría convertirse en un problema de rendimiento. Cuantas más tablas tenga la unión, más variantes de planes de ejecución hay que evaluar (viendo el lado matemático serían n! (crecimiento factorial), aunque eso no es un problema cuando se usan las variables Bind.

Importante

Cuanto más compleja sea la sentencia, más importante es usar las variables Bind.

No usar las variables Bind es como recompilar cada vez el programa.

Si te gusta mi manera de explicar, te encantará mi libro.

Contenido

  1. Loop anidados — Acerca del problema de selección N+1 en ORM

  2. Hash join — Requiere un enfoque completamente diferente para indexar

  3. Sort-Merge join — Como un cierre sobre dos conjuntos ordenados

Previous pageNext page

Acerca del autor

Foto de Markus Winand

Markus Winand enseña eficientemente SQL, en casa y online. Minimiza el tiempo de desarrollo utilizando moderno SQL y optimiza el tiempo de ejecución con indexación inteligente. Para ello también ha publicado el libro SQL Performance Explained.

“Use The Index, Luke” de Markus Winand se halla bajo licencia Creative Commons Attribution-Noncommercial-No Derivative Works 3.0 Unported License.
Aspectos legales | Contacto | SIN GARANTÍA | Marcas | Privacy | CC-BY-NC-ND 3.0 licencia