Jag har arbetat med att finjustera några SQL-satser i en nyligen uppgraderad databas, från Oracle 11.2.0.4 till 12.1.0.2. Som jag vanligtvis gör, gillar jag att använda SQL Developer för att se Explain Plan. Jag blev förvånad över att se lite grå text i Explain Plan-utgången, som du kan se nedan.
Min första reaktion var att flippa ut och undra varför Oracle har både en Hash Join och en Nested Loops-anslutning för att gå med två bord. Senare i planen ser jag ett INDEX (FAST FULL SCAN) av samma tabell som har INDEX (RANGE SCAN) utförd. Varför två åtkomster av samma tabell? Vad gör Oracle 12c?
Allt detta är en del av den nya 12c Optimizers Adaptive Query Optimization. För denna SQL-sats har Optimizern bestämt sig för att använda en initial plan som involverar Nested Loops-anslutningen. För planen som innebär att de kapslade looparna går med, kommer Oracle att komma åt tabellen med en Index Range Scan. Optimizern har också beslutat att en Index Fast Full Scan in i en Hash Join kan vara en annan exekveringsplan att överväga. Innan exekveringen av SQL-satsen börjar har Optimizern två planer. En plan är standard plan och den andra planen är den adaptiva planen. Oracle kommer att titta på körningen av SQL-satsen när den börjar köras med standardplanen. Om Oracle fastställer att detta är fel genomförandeplan kan det byta till den adaptiva planen i farten.
För mer information om adaptiva planer, se denna vitbok från Oracle. Sidorna 3-5 illustrerar Adaptive Join Plans i aktion.
Den grå texten i Explain Plan ovan är helt enkelt den adaptiva planen. SQL Developer 4.1 visar både standardplanen och den adaptiva planen.
Längre ner i Explain Plan finns avsnittet Other XML, som kan ses nedan. Vi kan se att min db-version är 12.1.0.2. Vi kan också informationstypen visar att detta är en adaptiv plan.
Observera avsnittet med titeln "rader". Vi kan se varje rad i Explain Plan. De rader där "skp=0" är en del av standardplanen. Raderna där "skp=1" är den adaptiva planen, som vi nu vet visas som grå text i SQL-utvecklare.