Salut,
Je viens vous voir car je me suis cassé les dents sur un problème théorique en faisant des tests à la maison.
J'ai imaginé la situation suivante : un client utilise le logiciel d'un éditeur, celui-ci a mis un hint INDEX dans un SELECT et, bien sur, nous n'avons pas la main sur l'ordre SQL pour changer celui-ci.
J'ai une table de 10 010 clients avec 10 DUPONT et 10 010 MARTIN.
Dans le SELECT 1, je filtre sur le nom DUPONT (10 clients sur 10 010) : le plan d'exécution est bon, il faut utiliser l'index vue la sélectivité.
Dans le SELECT 2, je filtre sur le nom MARTIN (10 000 clients sur 10 010) : le plan d'exécution est mauvais, il utilise l'index à cause du hint MAIS, vue la sélectivité, il devrait faire un FTS (j'ai testé en enlevant le hint et le coût est divisé par 10).
Mon problème est le suivant : j'arrive à avoir dans ma base les deux ordres SQL (celui avec le hint du logiciel et celui que je joue sans hint), j'ai deux bons plans d'exécutions.
Ce que je veux, c'est créer une baseline sur le SELECT 1 et lui associer les deux plans d'exécutions. ATTENTION : le SELECT 2 a un SQL ID différent du premier car le hint INDEX ne s'y trouve pas. Donc je veux associer au SQL ID 1 le plan d'exécution du SQL ID 1 et aussi celui du SQL ID 2.
OK, rien ne me dit que le CBO prendra parfois le FTS car je continuerai a exécuter le SELECT 1 avec le hint mais je voudrais quand même faire cette expérience pour voir ce qui se passe. En effet, un hint n'est pas un ordre mais un conseil, peut-être que le CBO, en voyant les deux plans, ne tiendra pas compte du hint et utilisera l'histogramme pour évaluer la sélectivité et basculer, selon le nom, d'un plan à l'autre.
Voilà, vous avez des idées? OK, c'est un peu tordu mais quand on ne peut pas modifier un ordre SQL, il faut se creuser les méninges
Partager