La unión de bucles anidados, también llamada iteración anidada, utiliza una entrada de unión como la tabla de entrada externa (mostrada como la entrada superior en el plan de ejecución gráfico; véase la Figura 1 a continuación) y la otra entrada como la tabla de entrada interna. El bucle externo consume la tabla de entrada externa fila por fila. El bucle interior, que se ejecuta para cada fila exterior, busca las filas coincidentes en la tabla de entrada interior. El listado siguiente es un ejemplo que produce una unión de bucles anidados.
--Nested Loop Join SELECT C.CustomerID, c.TerritoryID FROM Sales.SalesOrderHeader oh JOIN Sales.Customer c ON c.CustomerID = oh.CustomerID WHERE c.CustomerID IN (10,12) GROUP BY C.CustomerID, c.TerritoryID
Nota: Está disponible para su descarga en wrox.com.
Figura 1. Ejemplo de plan de ejecución para la unión de bucles anidados
Una unión de bucles anidados es particularmente efectiva si la entrada exterior es pequeña y la entrada interior está ordenada y es grande. En muchas transacciones pequeñas, como las que afectan sólo a un pequeño conjunto de filas, las uniones de bucles anidados indexados son superiores a las uniones merge y a las uniones hash. Sin embargo, en las consultas grandes, las uniones de bucles anidados no suelen ser la opción óptima. Por supuesto, la presencia de un operador de unión de bucles anidados en el plan de ejecución no indica si se trata de un plan eficiente. Una unión de bucles anidados es el algoritmo por defecto. Esto no significa que sea el primer algoritmo utilizado (eso sería el hash join en memoria), sino que siempre se puede aplicar si otro algoritmo coincide con los criterios específicos. Por ejemplo, el algoritmo «requiere join» debe ser equijoin. (La condición de unión se basa en el operador de igualdad.)
En la consulta de ejemplo, se realiza una búsqueda de índice agrupado en la tabla externa Customer donde CustomerID es 10 o 12, y para cada CustomerID, se realiza una búsqueda de índice en la tabla interna SalesOrderHeader. Por lo tanto, el índice IX_SalesOrderHeader_CustomerID se busca dos veces (una vez para CustomerID 10 y una vez para CustomerID 12) en la tabla SalesOrderHeader.