23 juillet 2015

Oracle - Effets du "cardinality feedback"

Chez un collègue les performances de certaines requête Oracle se dégradaient lorsqu’elles étaient lancées plus d’une fois.

<< Depuis la version 11.2.0.1 de oracle, lorsqu’une requête est exécutée de façon répétitive, l’optimiseur tente d’améliorer son plan d’exécution après chaque passage.
Pour atteindre cet objectif, il utilise la technique de "cardinality feedback" pour s’informer sur les mauvaises estimations qu’il vient de faire pendant la génération de l’actuel plan d’exécution. Au passage suivant, il essaye de générer un nouveau plan d’exécution en se basant sur les informations précédentes.
Hélas, le nouveau plan n’est pas toujours optimal, ce qui peut contribuer à dégrader la performance de la requête à partir de la deuxième exécution

Pour savoir si le Cardinality Feedback est utilisée, se reférer à la partie Note du plan d’exécution où il est indiqué :  "Cardinality Feedback used for this statement" - ou bien interroger la colonne USE_FEEDBACK_STATS de la vue dynamique V$SQL_SHARED_CURSOR. Cette colonne doit être initialisée à ‘Y’ >>


Note de Oracle :
Cardinality feedback. This feature, enabled by default in 11.2, is intended to improve plans for repeated executions. See Support note 1344937.1 and documentation for additional info.
You can be disable cardinality feedback with an underscore parameter which can be set at session or instance level. Usual caveats on setting underscore parameters apply:
alter session set "_OPTIMIZER_USE_FEEDBACK"=FALSE;
This can also be done with a hint, therefore at statement level, using the opt_param syntax: /*+ opt_param('_OPTIMIZER_USE_FEEDBACK','FALSE') */