Consideremos un ejemplo: una tabla con registros de facturas y una tabla relacionada con registros de líneas de pedido de facturas. Considere el pseudocódigo del cliente:
for each (invoice in invoices)
let invoiceLines = FindLinesFor(invoice)
...
Si tiene 100,000 facturas con 10 líneas cada una, este código buscará 10 líneas de factura de una tabla de 1 millón, y lo hará 100,000 veces. A medida que aumenta el tamaño de la tabla, aumenta el número de operaciones de selección y aumenta el costo de cada operación de selección.
Debido a que las computadoras son rápidas, es posible que no note una diferencia de rendimiento entre los dos enfoques si tiene varios miles de registros o menos. Debido a que el aumento de costos es más que lineal, a medida que aumenta el número de registros (en millones, por ejemplo), comenzará a notar una diferencia, y la diferencia será menos tolerable a medida que crezca el tamaño del conjunto de datos.
La unión, sin embargo. utilizará los índices de la tabla y fusionará los dos conjuntos de datos. Esto significa que está escaneando efectivamente la segunda tabla una vez en lugar de accederla aleatoriamente N veces. Si hay una clave externa definida, la base de datos ya tiene los enlaces entre los registros relacionados almacenados internamente.
Imagina hacer esto tú mismo. Tiene una lista alfabética de estudiantes y un cuaderno con todos los informes de calificaciones de los estudiantes (una página por clase). El cuaderno está ordenado por los nombres de los alumnos, en el mismo orden que la lista. ¿Cómo preferirías continuar?
- Lee un nombre de la lista.
- Abre el cuaderno.
- Encuentra el nombre del alumno.
- Lea las calificaciones del alumno, pasando las páginas hasta llegar al siguiente alumno o la última página.
- Cierra el cuaderno.
- Repetir.
O:
- Abra el cuaderno en la primera página.
- Lee un nombre de la lista.
- Lea las notas para ese nombre del cuaderno.
- Repita los pasos 2-3 hasta llegar al final.
- Cierra el cuaderno.