Sisäkkäinen silmukkaliitos, jota kutsutaan myös sisäkkäiseksi iteraatioksi, käyttää yhtä liitoksen syötettä ulompana syöttötaulukkona (joka näkyy graafisessa suoritussuunnitelmassa ylimpänä syötteenä; ks. kuva 1 alla) ja toista syötettä sisempänä syöttötaulukkona. Ulompi silmukka kuluttaa ulomman syöttötaulukon rivi riviltä. Sisempi silmukka, joka suoritetaan jokaisen ulomman rivin kohdalla, etsii vastaavia rivejä sisäisestä syöttötaulukosta. Alla olevassa listauksessa on esimerkki, joka tuottaa sisäkkäisen silmukan yhdistämisen.

--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

Huomautus: Tämä on ladattavissa osoitteesta wrox.com.

Wiley Admin 13_26

Kuva 1. Verkkosilmukan yhdistäminen. Esimerkki suoritussuunnitelmasta sisäkkäisten silmukoiden yhdistämiselle

Sisäkkäisten silmukoiden yhdistäminen on erityisen tehokasta, jos ulompi syöte on pieni ja sisempi syöte on lajiteltu ja suuri. Monissa pienissä tapahtumissa, kuten sellaisissa, jotka vaikuttavat vain pieneen joukkoon rivejä, indeksoidut sisäkkäiset silmukkaliitokset ovat parempia kuin yhdistelmäliitokset ja hash-liitokset. Suurissa kyselyissä sisäkkäiset silmukkayhteydet eivät kuitenkaan useinkaan ole optimaalinen valinta. Sisäkkäisten silmukoiden yhdistämisoperaattorin esiintyminen suoritussuunnitelmassa ei tietenkään kerro, onko se tehokas suunnitelma. Sisäkkäisten silmukoiden yhdistäminen on oletusalgoritmi. Tämä ei tarkoita, että sitä käytetään ensimmäisenä algoritmina (se olisi muistissa oleva hash join), vaan että sitä voidaan aina käyttää, jos jokin muu algoritmi täyttää tietyt kriteerit. Esimerkiksi ”vaatii join”-algoritmin on oltava equijoin. (Join-ehto perustuu equality-operaattoriin.)

Esimerkkikyselyssä suoritetaan klusteroitu indeksin haku ulommassa taulussa Customer, jossa CustomerID on 10 tai 12, ja jokaiselle CustomerID:lle suoritetaan indeksin haku sisäisessä taulussa SalesOrderHeader. Näin ollen indeksiä IX_SalesOrderHeader_CustomerID haetaan kaksi kertaa (kerran CustomerID 10:lle ja kerran CustomerID 12:lle) SalesOrderHeader-taulusta.

Articles

Vastaa

Sähköpostiosoitettasi ei julkaista.