En règle générale, puisque vous parlez de règle générale si tant est qu’une règle générale existe en ORACLE, à chaque fois que vous devez analyser la performance d’une requête SQL ou simplement lorsque vous voulez comprendre le choix fait par Oracle (CBO) pour exécuter votre requête vous devez passer par un explain plan. Dans ce cas vous devez:
- Obtenir l’explain plan (de préférence le vrai explain plan et non l’approximatif)
- L’interpréter
- Juger son efficacité
Comme le précise Jonathan Lewis dans son livre ‘’Cost Based Oracle Fundamentals’’, le CBO peut se tromper pour les raisons suivantes :
- Des hypothèses inappropriées existent dans le model du CBO
- Les statistiques représentants la répartition des données sont absentes
- Les statistiques représentants la répartition des données sont présentes mais ne reflètent pas fidèlement la réalité de cette répartition
- Les caractéristiques de la machine (hardware performance characteristics) sont inconnues
- Le volume des données est inconnu
- Il existe un bug dans le code du CBO
La plupart des mauvais choix faits par le CBO proviennent de la différence d’opinion entre votre connaissance propre de vos données et celle que le CBO estime connaitre. C’est pour cela que tous mes explains plan (enfin la majorité) je les prends en utilisant le hint /*+ gather_plan_statistics */ dans mes requêtes et en utilisant:
Select * from table(dbms_xplan.display_cursor(null,null, ALLSTATS LAST)) ;
Ainsi, grâce à E-Rows et A-Rows, je peux tout de suite savoir si les estimations faites par le CBO sont correctes ou pas. Dans le cas contraire, c’est une indication de statistiques ne reflétant pas la réalité. Je donne aussi une très grande importance à la partie ‘’Predicate’’ de mon explain plan parce qu’en effet ,souvent, cette partie montre les transformations faites par le CBO et surtout les conversions implicites empêchant l’utilisation des indexes lorsque ceux-ci sont appropriés.
Pour revenir à votre cas, je vous conseille:
- De générer les trois explains plans(les vrais avec E-Rows et A-Rows) avec leur partie predicate
- D’interpréter ces trois explains plans
- De trouver le plus efficace d’entre eux et de savoir pourquoi
Enfin, comme il s’agit ici de l’optimisation d’une jointure à deux tables, c’est avec un immense plaisir que je vous conseille la présentation suivante faite par Jonathan Lewis:
http://jonathanlewis.wordpress.com/2011/06/23/video/
dont j’ai l’intention d’en faire un résumé en français un de ces jours.
Partager