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

Administration Oracle Discussion :

Une requête parsée plusieurs fois


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 20
    Par défaut Une requête parsée plusieurs fois
    Bonjour,
    J'ai une requete qui utlise des variables bindé, alors que la requete est parsé tant de fois que de variable. ci-dessous la requete :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  reference,date
     FROM commande 
    WHERE reference = :"VAR_B_0"
    Le TKPROF de cette requete est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse      788      0.02       0.02          0          0          0           0
    Execute   1989      0.06       0.05          0          0          0           0
    Fetch     1989      0.08       0.07          0       7956          0        1989
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total     4766      0.18       0.15          0       7956          0        1989
    Alors je vois que la requete est parsé 788 fois, chose qui est anormale.

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    536
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 536
    Par défaut
    Pourriez-vous poster la totalité du fichier TKPROF. Ou à la limite la partie qui reprend la requête en question.

  3. #3
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    La requête est parsée 788 fois et exécutée 1989 fois. Le TKPROF enregistre les deux types des parse : soft et hard. Si le code à été écrit pour demander le parsing, TKPROF ne peut que l’enregistrer. Voire l'exemple ou la demande de parsing est placée d'une manière erronée à l'intérieur de la boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    declare
      last_name hr.employees.last_name%Type;
      ch        integer;
      r         integer;
    Begin
      ch := dbms_sql.open_cursor;
      for i in 1..100 Loop
        DBMS_SQL.PARSE(ch, 'Select last_name from hr.employees WHERE employee_id = :id',
                         DBMS_SQL.NATIVE);
        DBMS_SQL.BIND_VARIABLE(ch, ':id', i);
        r := DBMS_SQL.EXECUTE(ch);       
      End Loop;                 
      DBMS_SQL.CLOSE_CURSOR(ch);
    Exception
      When Others Then
        DBMS_SQL.CLOSE_CURSOR(ch);
        Raise;
    End;
    /
    et le TKPROF
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Select last_name
    from
     hr.employees WHERE employee_id = :id
     
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse      100      0.00       0.00          0          0          0           0
    Execute    100      0.00       0.09          0          0          0           0
    Fetch        0      0.00       0.00          0          0          0           0
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total      200      0.00       0.09          0          0          0           0

  4. #4
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    En complément du message de Mnitu, si vous êtes en version 11R2, la requête est peut être sensible à la valeur de la variable ce qui peut expliquer plusieurs "hard parse"

  5. #5
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 20
    Par défaut
    Citation Envoyé par Mohamed.Houri Voir le message
    Pourriez-vous poster la totalité du fichier TKPROF. Ou à la limite la partie qui reprend la requête en question.
    Merci pour ves feedback. je suis en version 11g. ci-joint le TKPROF complét.
    Fichiers attachés Fichiers attachés

  6. #6
    Membre expérimenté
    Avatar de ora_home
    Homme Profil pro
    Consultant Oracle
    Inscrit en
    Février 2009
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Consultant Oracle
    Secteur : Finance

    Informations forums :
    Inscription : Février 2009
    Messages : 103
    Par défaut
    Bonjour,
    Pout le cas cité, Oracle faite un HARD PARSE pour chaque valeur de la variable "VAR_B_0".
    Alors si tu veux parser la requete une seule fois, pense à changer le paramétre : CURSOR_SHARING
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter system set cursor_sharing= FORCE;

  7. #7
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    La présence des ":SYS_B_"X indique que vous est en CURSOR_SHARING = FORCE.
    Le message "Misses in library cache during parse: 0" indique des soft_parses.

  8. #8
    Membre averti
    Femme Profil pro
    Inscrit en
    Septembre 2012
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Femme

    Informations forums :
    Inscription : Septembre 2012
    Messages : 20
    Par défaut
    Citation Envoyé par mnitu Voir le message
    La présence des ":SYS_B_"X indique que vous est en CURSOR_SHARING = FORCE.

    Non mnitu, après avoir vérifié j'ai trouvé CURSOR_SHARING = SIMILAR

Discussions similaires

  1. [MySQL] Relancer une requête SQL plusieurs fois
    Par Steufa dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 16/06/2013, 19h33
  2. Sous-requête excutée plusieurs fois dans une requête
    Par sheridan31 dans le forum Oracle
    Réponses: 8
    Dernier message: 03/07/2006, 16h18
  3. une requête avec plusieurs INNER JOIN, cmt faire ?
    Par elhosni dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/01/2006, 17h55
  4. [SQL] Une requête dans plusieurs tables
    Par Anduriel dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/12/2005, 16h23
  5. Réponses: 2
    Dernier message: 10/07/2004, 17h14

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