Der verschachtelte Schleifen-Join, auch verschachtelte Iteration genannt, verwendet eine Join-Eingabe als äußere Eingabetabelle (im grafischen Ausführungsplan als oberste Eingabe dargestellt; siehe Abbildung 1 unten) und die andere Eingabe als innere Eingabetabelle. Die äußere Schleife verwertet die äußere Eingabetabelle Zeile für Zeile. Die innere Schleife, die für jede äußere Zeile ausgeführt wird, sucht nach passenden Zeilen in der inneren Eingabetabelle. Die folgende Auflistung ist ein Beispiel, das eine verschachtelte Schleifenverknüpfung erzeugt.
--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
Hinweis: Dies steht auf wrox.com zum Download bereit.
Abbildung 1. Beispielhafter Ausführungsplan für geschachtelte Schleifenverbindung
Eine geschachtelte Schleifenverbindung ist besonders effektiv, wenn die äußere Eingabe klein und die innere Eingabe sortiert und groß ist. In vielen kleinen Transaktionen, z. B. solchen, die nur einen kleinen Satz von Zeilen betreffen, sind indizierte geschachtelte Schleifen-Joins sowohl den Merge-Joins als auch den Hash-Joins überlegen. Bei großen Abfragen sind geschachtelte Schleifen-Joins jedoch oft nicht die optimale Wahl. Natürlich sagt das Vorhandensein eines Operators für geschachtelte Schleifen-Joins im Ausführungsplan nichts darüber aus, ob es sich um einen effizienten Plan handelt. Ein geschachtelter Schleifen-Join ist der Standardalgorithmus. Das bedeutet nicht, dass er der erste Algorithmus ist, der verwendet wird (das wäre der speicherinterne Hash-Join), sondern dass er immer dann angewendet werden kann, wenn ein anderer Algorithmus die spezifischen Kriterien erfüllt. Der Algorithmus „erfordert Verknüpfung“ muss zum Beispiel equijoin sein. (Die Join-Bedingung basiert auf dem Gleichheitsoperator.)
In der Beispielabfrage wird eine geclusterte Indexsuche in der äußeren Tabelle Customer durchgeführt, wenn CustomerID 10 oder 12 ist, und für jede CustomerID wird eine Indexsuche in der inneren Tabelle SalesOrderHeader durchgeführt. Daher wird der Index IX_SalesOrderHeader_CustomerID zweimal (einmal für CustomerID 10 und einmal für CustomerID 12) in der Tabelle SalesOrderHeader gesucht.