Il nested loop join, chiamato anche iterazione nidificata, usa un input di join come tabella di input esterno (mostrato come l’input superiore nel piano di esecuzione grafico; vedi Figura 1 sotto) e l’altro input come tabella di input interno. Il ciclo esterno consuma la tabella di input esterna riga per riga. Il ciclo interno, eseguito per ogni riga esterna, cerca le righe corrispondenti nella tabella di input interna. L’elenco qui sotto è un esempio che produce un nested 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
Nota: Questo è disponibile per il download su wrox.com.
Figura 1. Un esempio di piano di esecuzione per un nested loop join
Un nested loop join è particolarmente efficace se l’input esterno è piccolo e l’input interno è ordinato e grande. In molte piccole transazioni, come quelle che riguardano solo un piccolo insieme di righe, le nested loop join indicizzate sono superiori sia alle merge join che alle hash join. Nelle grandi query, tuttavia, le nested loop joins spesso non sono la scelta ottimale. Naturalmente, la presenza di un operatore di nested loop join nel piano di esecuzione non indica se si tratta di un piano efficiente. Un nested loop join è l’algoritmo predefinito. Questo non significa che è il primo algoritmo usato (che sarebbe l’hash join in-memory), ma che può sempre essere applicato se un altro algoritmo soddisfa i criteri specifici. Per esempio, l’algoritmo “richiede un join” deve essere equijoin. (La condizione di join si basa sull’operatore di uguaglianza.)
Nella query di esempio, viene eseguita una ricerca di indice clustered sulla tabella esterna Customer dove CustomerID è 10 o 12, e per ogni CustomerID, viene eseguita una ricerca di indice sulla tabella interna SalesOrderHeader. Pertanto, l’indice IX_SalesOrderHeader_CustomerID viene cercato due volte (una volta per CustomerID 10 e una volta per CustomerID 12) sulla tabella SalesOrderHeader.