Comparer deux plans d’exécution

par | Juil 31, 2019 | Trucs et Astuces

Une requête est en cours d’exécution, la fenêtre SQL Info permet de la suivre :

Les performances de cette requête se dégradent après un certain temps.
Ouvrir une autre fenêtre SQL Info permet de suivre son nouveau comportement :

A priori, il n’y a pas grand-chose qui distingue les deux comportements de cette requête, mais pourtant son plan d’exécution a changé, faisant notamment passer de 20 à 22 le nombre de blocs touchés par exécution (« logical reads »), soit une dégradation de 10% ressentie par les utilisateurs.
Et il n’est pas évident de détecter avec précision ce qui a changé dans le plan d’exécution.

Pour observer instantanément les différences entre deux plans d’exécution, la fenêtre SQL Info offre un bouton « Plans comparison » :

En cliquant sur ce bouton une première fois, le premier plan d’exécution est sélectionné, un message le confirme :

Le second plan d’exécution peut alors être choisi à son tour dans la deuxième fenêtre SQL Info, par un clic sur le même bouton :

Les différences entre les deux plans sont alors mises en évidence à l’aide de deux couleurs :

Le jaune correspond au premier plan d’exécution choisi, et le bleu au second plan.
Ainsi, dans cet exemple, on voit très rapidement que l’index ORDER_CUSTOMER_NUM_IDX est désormais choisi par l’optimiseur, alors qu’avant Oracle utilisait l’index ORDER_EXPECTED_DELIVERY_DATE_IDX, visiblement plus performant.

Certaines situations deviennent alors très simples à comprendre, comme par exemple :

  • un changement d’index,
  • le passage d’un index à un full scan,
  • le choix d’un HASH JOIN au lieu d’un NESTED LOOPS,
  • l’inversion de l’ordre de deux tables,

Bien sûr, certaines fois les différences entre deux plans d’exécution sont bien plus nombreuses et la lecture moins facile que dans cet exemple, mais cela permet de voir comment fonctionne la comparaison de plans.