Ho lavorato sull'ottimizzazione di alcune istruzioni SQL in un database appena aggiornato, da Oracle 11.2.0.4 a 12.1.0.2. Come faccio di solito, mi piace usare SQL Developer per vedere il piano di spiegazione. Sono stato sorpreso di vedere del testo grigio nell'output Spiega il piano, che puoi vedere di seguito.
La mia prima reazione è stata di impazzire e chiedermi perché Oracle abbia sia un join Hash Join che un Nested Loops per unire due tabelle. Più avanti nel piano, vedo un INDEX (FAST FULL SCAN) della stessa tabella che ha eseguito l'INDEX (RANGE SCAN). Perché due accessi della stessa tabella? Che cosa sta facendo Oracle 12c?
Tutto questo fa parte della nuova ottimizzazione adattiva delle query dell'ottimizzatore 12c. Per questa istruzione SQL, l'Ottimizzatore ha deciso di utilizzare un piano iniziale che coinvolge il join Nested Loops. Per il piano che prevede l'unione di Nested Loops, Oracle accederà alla tabella con una scansione dell'intervallo di indici. L'Ottimizzatore ha anche deciso che una scansione completa dell'indice in un hash join potrebbe essere un altro piano di esecuzione da considerare. Prima dell'inizio dell'esecuzione dell'istruzione SQL, l'ottimizzatore ha due piani. Un piano è il predefinito piano e l'altro piano è quello adattivo Piano. Oracle osserverà l'esecuzione dell'istruzione SQL mentre inizia l'esecuzione con il piano predefinito. Se Oracle determina che questo è il piano di esecuzione sbagliato, può passare al piano adattivo al volo.
Per ulteriori informazioni sui piani adattivi, consulta questo white paper di Oracle. Le pagine 3-5 illustrano i piani di unione adattivi in azione.
Il testo grigio nell'Explain Plan sopra è semplicemente il piano adattivo. SQL Developer 4.1 mostra sia il piano predefinito che il piano adattivo.
Più in basso nell'Explain Plan c'è la sezione Other XML, che può essere vista di seguito. Possiamo vedere che la mia versione db è 12.1.0.2. Possiamo anche che il tipo di informazioni mostri che si tratta di un piano adattivo.
Nota la sezione intitolata "righe". Possiamo vedere ogni riga dell'Explain Plan. Quelle righe in cui "skp=0" fanno parte del piano predefinito. Le righe in cui "skp=1" sono il piano adattivo, che ora sappiamo apparire come testo grigio in SQL Developers.