J'ai travaillé sur le réglage de certaines instructions SQL dans une base de données récemment mise à niveau, d'Oracle 11.2.0.4 à 12.1.0.2. Comme je le fais habituellement, j'aime utiliser SQL Developer pour voir le plan d'explication. J'ai été surpris de voir du texte grisé dans la sortie du plan d'explication, que vous pouvez voir ci-dessous.
Ma première réaction a été de paniquer et de me demander pourquoi Oracle a à la fois une jointure de hachage et une jointure de boucles imbriquées pour joindre deux tables. Plus tard dans le plan, je vois un INDEX (FAST FULL SCAN) de la même table qui a effectué l'INDEX (RANGE SCAN). Pourquoi deux accès d'une même table ? Que fait Oracle 12c ?
Tout cela fait partie de la nouvelle optimisation adaptative des requêtes de 12c Optimizer. Pour cette instruction SQL, l'optimiseur a décidé d'utiliser un plan initial impliquant la jointure Nested Loops. Pour le plan qui implique la jointure Nested Loops, Oracle accédera à la table avec une analyse de plage d'index. L'optimiseur a également décidé qu'une analyse complète rapide d'index dans une jointure de hachage peut être un autre plan d'exécution à envisager. Avant le début de l'exécution de l'instruction SQL, l'optimiseur a deux plans. Un plan est le par défaut plan et l'autre plan est le plan adaptatif plan. Oracle surveillera l'exécution de l'instruction SQL lorsqu'elle commencera à s'exécuter avec le plan par défaut. Si Oracle détermine qu'il s'agit du mauvais plan d'exécution, il peut passer au plan adaptatif à la volée.
Pour plus d'informations sur les plans adaptatifs, consultez ce livre blanc d'Oracle. Les pages 3 à 5 illustrent les plans de jointure adaptative en action.
Le texte gris dans le plan d'explication ci-dessus est simplement le plan adaptatif. SQL Developer 4.1 affiche à la fois le plan par défaut et le plan adaptatif.
Plus bas dans le plan d'explication se trouve la section Autre XML, qui peut être vue ci-dessous. Nous pouvons voir que ma version de base de données est 12.1.0.2. Nous pouvons également le type d'informations indique qu'il s'agit d'un plan adaptatif.
Notez la section intitulée "lignes". Nous pouvons voir chaque rangée du plan d'explication. Les lignes où "skp=0" font partie du plan par défaut. Les lignes où "skp=1" sont le plan adaptatif, que nous connaissons maintenant, apparaissent sous forme de texte grisé dans SQL Developers.