Ik heb gewerkt aan het afstemmen van enkele SQL-instructies in een onlangs bijgewerkte database, van Oracle 11.2.0.4 naar 12.1.0.2. Zoals ik gewoonlijk doe, gebruik ik graag SQL Developer om het Explain Plan te zien. Ik was verrast om wat grijze tekst te zien in de uitvoer van Plan uitleggen, die je hieronder kunt zien.
Mijn eerste reactie was om in paniek te raken en me af te vragen waarom Oracle zowel een Hash Join als een Nested Loops-join heeft om twee tafels samen te voegen. Later in het plan zie ik een INDEX (FAST FULL SCAN) van dezelfde tabel die de INDEX (RANGE SCAN) heeft uitgevoerd. Waarom twee toegangen tot dezelfde tafel? Wat doet Oracle 12c?
Dit alles maakt deel uit van Adaptive Query Optimization van de nieuwe 12c Optimizer. Voor deze SQL-instructie heeft de Optimizer besloten een eerste plan te gebruiken met de Nested Loops-join. Voor het plan dat de Nested Loops-join omvat, krijgt Oracle toegang tot de tabel met een Index Range Scan. De Optimizer heeft ook besloten dat een Index Fast Full Scan naar een Hash Join een ander uitvoeringsplan kan zijn om te overwegen. Voordat de uitvoering van de SQL-instructie begint, heeft de Optimizer twee plannen. Eén plan is de standaard plan en het andere plan is het adaptieve plan. Oracle zal de uitvoering van de SQL-instructie bekijken terwijl deze wordt uitgevoerd met het standaardplan. Als Oracle vaststelt dat dit het verkeerde uitvoeringsplan is, kan het direct overschakelen naar het adaptieve plan.
Zie deze whitepaper van Oracle voor meer informatie over Adaptive Plans. Pagina's 3-5 illustreren Adaptive Join Plans in actie.
De grijze tekst in het Explain Plan hierboven is gewoon het adaptieve plan. SQL Developer 4.1 toont zowel het standaardplan als het adaptieve plan.
Verderop in het Explain Plan is de Other XML-sectie, die hieronder te zien is. We kunnen zien dat mijn db-versie 12.1.0.2 is. We kunnen ook het infotype laten zien dat dit een Adaptief Plan is.
Let op het gedeelte met de titel "rijen". We kunnen elke rij van het Explain Plan zien. Die regels waar "skp=0" deel uitmaken van het standaardplan. De regels waar "skp=1" het adaptieve plan zijn, waarvan we nu weten dat ze verschijnen als grijze tekst in SQL Developers.