IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

Mauvais plan d'exécution pour une requête avec plusieurs bind variable


Sujet :

SQL Oracle

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut Mauvais plan d'exécution pour une requête avec plusieurs bind variable
    Bonjour,
    une requête généré par un MDM (IHM) dure 2 min pour afficher un résultat d'une recherche. cette même requête exécutée sous sqldev en changeant les variables bind avec leurs valeurs elle dure 3 secondes. je sais c'est pas la même requête (c'est pas le même sq_lid et pas le même plan d'execution) . je pensais qu'Oracle changé les variables bind avec leurs valeurs avant de faire un hard parse (bind peeking) ?
    je cherche à optimiser cette requête sachant que je ne peux pas la réécrire , ni mettre des hint ....
    Merci par avance pour votre aide.

    nb: base Oracle standard 19c

  2. #2
    Membre Expert
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2013
    Messages
    2 005
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2013
    Messages : 2 005
    Par défaut
    Salut,
    Il nous faudrait le texte de la requête, et, surtout, les deux plans d'exécutions.
    Tu es en édition Entreprise ou Standard?

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Il est probable que les données ne soient pas distribuées de façon homogène (skewed) sur un ou plusieurs des critères de recherche.

    Il faut regarder du côté des stats pour voir si il y a des histogrammes de créés ce qui devrait permettre d'activer le Adaptive Cursor Sharing.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    veuillez trouver ci-joint les deux plans (MDM et sqldev) + la requete générée par le progiciel (MDM). la version c'est Oracle Database 19c Enterprise Edition Release 19.0.0.0.0.

    pour info quand j'exécute la requete sur sqldev mais avec les variables bind (pour faire comme le MDM) je reproduits le pbm de perf .
    Fichiers attachés Fichiers attachés

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 952
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 952
    Par défaut
    Je vous conseille d'afficher le plan d’exécution avec les stats de chaque étape pour comprendre ou le choix est mauvais.

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    En fait dans le bon plan (la ou je remplace la variable bind avec sa valeur) oracle commence par appliquer la condition sur le numéro de contrat qui est un critère discriminant (via un index) puis accède à la table personne . mais avec le mauvais plan il fait un FTS sur la table personne (3 millions) puis fait des jointures avec les autres tables avec un nested loop !! et à la fin il applique le critère sur le numéro de contrat.
    Malgré le calcul de stat il se trempe de plan .

  7. #7
    Nouveau membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2020
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Décembre 2020
    Messages : 7
    Par défaut
    Avez-vous des pistes à me communiquer ? merci par avance pour votre aide

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 962
    Par défaut
    Question bind variables, il y aussi les 2 tests sur le rownum qui sont différents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
       1 - filter("T$RN2"."C$ROWNUM">=0)
       2 - filter(ROWNUM<=100)
     
       1 - filter("T$RN2"."C$ROWNUM">=:45)
       2 - filter(ROWNUM<=:44)


    ce qui fait aussi que vous avez un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    |*  4 |     SORT ORDER BY STOPKEY                       |                                 |     1 |  1039 | 95392   (1)| 00:00:04 |
    d'un côté et pas de l'autre.

    (Il y a beaucoup de discussions sur AskTOM à propos de "SORT ORDER BY STOPKEY")

Discussions similaires

  1. Réponses: 10
    Dernier message: 26/07/2012, 11h01
  2. Affichage du plan d'exécution d'une requête
    Par orafrance dans le forum Contribuez
    Réponses: 1
    Dernier message: 30/12/2011, 16h01
  3. Forcer le choix du plan d'exécution d'une requête
    Par hmechbal dans le forum Oracle
    Réponses: 5
    Dernier message: 20/01/2011, 23h28
  4. tunning pour une requête avec des CLOB
    Par aba_dana dans le forum Administration
    Réponses: 4
    Dernier message: 12/08/2010, 15h12
  5. Erreur lors de l'exécution d'une requête avec ADOquery
    Par doolar dans le forum Bases de données
    Réponses: 2
    Dernier message: 03/05/2008, 13h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo