The nested loop join, também chamado de iteração aninhada, usa uma entrada de join como tabela de entrada externa (mostrada como a entrada superior no plano gráfico de execução; veja a Figura 1 abaixo) e a outra entrada como tabela de entrada interna. O laço externo consome a tabela de entrada externa linha por linha. O laço interno, executado para cada linha externa, procura por linhas correspondentes na tabela de entrada interna. A lista abaixo é um exemplo que produz um loop join.
--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
Note: Isto está disponível para download em wrox.com.
Figure 1. Exemplo de Plano de Execução para Junção de Loop Aninhado
Uma junção de loop aninhado é particularmente eficaz se a entrada externa for pequena e a entrada interna for classificada e grande. Em muitas transações pequenas, tais como aquelas que afetam apenas um pequeno conjunto de linhas, as uniões de loop aninhado indexado são superiores às uniões de fusão e às uniões de hash. Em consultas grandes, no entanto, as uniões de loop aninhado muitas vezes não são a escolha ideal. É claro que a presença de um operador de junção de loop aninhado no plano de execução não indica se este é um plano eficiente. Uma junção em loop aninhado é o algoritmo padrão. Isto não significa que é o primeiro algoritmo usado (que seria o in-memory hash join), mas que pode sempre ser aplicado se outro algoritmo corresponder aos critérios específicos. Por exemplo, o algoritmo “requires join” deve ser equijoin. (A condição de join é baseada no operador de igualdade.)
Na consulta de exemplo, uma busca de índice agrupada é realizada na tabela externa Cliente onde CustomerID é 10 ou 12, e para cada CustomerID, uma busca de índice é realizada na tabela interna SalesOrderHeader. Portanto, o índice IX_SalesOrderHeader_Cliente_Cliente é procurado duas vezes (uma vez para CustomerID 10 e outra para CustomerID 12) na tabela SalesOrderHeader.