Zagnieżdżone złączenie pętli, zwane również zagnieżdżoną iteracją, używa jednego wejścia złączenia jako zewnętrznej tabeli wejściowej (pokazanej jako górne wejście w graficznym planie wykonania; patrz rysunek 1 poniżej) i drugiego wejścia jako wewnętrznej tabeli wejściowej. Zewnętrzna pętla zużywa zewnętrzną tabelę wejściową wiersz po wierszu. Wewnętrzna pętla, wykonywana dla każdego wiersza zewnętrznego, szuka pasujących wierszy w wewnętrznej tabeli wejściowej. Poniższy listing jest przykładem, który tworzy zagnieżdżoną pętlę 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
Uwaga: To jest dostępne do pobrania na wrox.com.
Rysunek 1. Sample Execution Plan for Nested Loop Join
Zagnieżdżona pętla join jest szczególnie efektywna, gdy zewnętrzne dane wejściowe są małe, a wewnętrzne posortowane i duże. W wielu małych transakcjach, takich jak te, które dotyczą tylko małego zestawu wierszy, indeksowane złączenia zagnieżdżonych pętli są lepsze zarówno od złączeń scalających jak i złączeń hash. W dużych zapytaniach jednak, zagnieżdżone złączenia pętli często nie są optymalnym wyborem. Oczywiście, obecność operatora złączenia zagnieżdżonej pętli w planie wykonania nie wskazuje na to, czy jest to efektywny plan. Zagnieżdżone złączenie pętli jest domyślnym algorytmem. Nie oznacza to, że jest to pierwszy algorytm, który zostanie użyty, ale że zawsze może zostać zastosowany, jeśli inny algorytm spełnia określone kryteria. Na przykład, algorytmem „wymaga złączenia” musi być equijoin. (Warunek złączenia jest oparty na operatorze równości.)
W przykładowym zapytaniu, klastrowane wyszukiwanie indeksu jest wykonywane na zewnętrznej tabeli Customer, gdzie CustomerID jest 10 lub 12, a dla każdego CustomerID, wyszukiwanie indeksu jest wykonywane na wewnętrznej tabeli SalesOrderHeader. Dlatego indeks IX_SalesOrderHeader_CustomerID jest wyszukiwany dwa razy (raz dla CustomerID 10 i raz dla CustomerID 12) w tabeli SalesOrderHeader.
.