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

Oracle Discussion :

[Oracle 10g] Temps d'exécution d'une requête


Sujet :

Oracle

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 80
    Points
    80
    Par défaut [Oracle 10g] Temps d'exécution d'une requête
    Bonjour,

    Je dois comparer 2 requêtes qui donne un résultat strictement équivalent au niveau données mais qui ont un temps d'exécution différent.

    J'utilise SQL Scratchpad pour lancer les requêtes, il me fournit le temps d'exécution et je peux également obtenir le plan d'éxécution.

    Mon problème est au niveau du temps d'exécution car celui n'ai quasiment jamais le même et comme je dois comparer les requêtes principalement à ce niveau là, c'est très difficile de savoir quelle requête est la plus performante.

    Si je lance la requête pour la 1ère fois sous SQL Scratchpad (après ouverture d'Oracle Enterprise Manager), il n'y a pas eu de mise en mémoire tampon (je suppose) et c'est pourquoi elle est toujours plus longue.
    Si je la relance tout de suite après elle est beaucoup plus rapide.
    Etant donné que je lance plusieurs fois les requêtes, que je fais des modifications, puis que je les relance...

    Comment faire pour vider cette mémoire tampon et avoir le temps réel que va mettre la requête ? car cette requête est utilisée pour une interface web et les utilisateurs veulent un résultat rapide à la première exécution.

    Je fais régulièrement un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    analyze table contrat estimate statistics;
    pour mettre à jour les stat.

    Je vous remercie de votre aide.

    Tux

  2. #2
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Je ne pense pas que le temps d'exécution soit un bon critère, car il peut varier pour des raisons diverses.
    Le mieux me semble de faire une trace et de l'analyser avec TKPROF, ou bien de te servir de la vue V$SQLAREA, suivant ta version d'Oracle

    Tu pourras ainsi retrouver les consommations en terme de CPU, de mémoire et d'I/O et départager ainsi plus facilement tes requêtes

    Si tu as accès à la vue v$SQLAREA, le plus simple est de rajouter un commentaire à ton select pour pouvoir l'identifier après:

    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
    21
     
    -- 1ère Requête à analyser
    SELECT /*ID1*/ ....
    FROM ...
    WHERE ...
     
    -- 2nd requête à analyser
    SELECT /*ID2*/ ...
    FROM ...
    WHERE ...
     
    -- Recherche des requètes dans V$SQLAREA
    -- la 1ère
    SELECT *
    FROM V$SQLAREA V
    WHERE V.SQL_TEXT LIKE '%ID1%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%'
     
    -- la 2nd
    SELECT *
    FROM V$SQLAREA V
    WHERE V.SQL_TEXT LIKE '%ID2%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%'

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 80
    Points
    80
    Par défaut
    Merci pour ta réponse.

    J'ai fait ce que tu m'as dit ; j'ai accès à la vue en question, j'ai les infos.

    Voici les résultats pour ID1 :
    CPU_TIME = 700163
    ELAPSED_TIME = 773731
    OPTIMIZER_MODE = All_Rows
    OPTIMIZER_COST = 255
    USER_IO_WAIT_TIME = 0
    Pour ID2:
    CPU_TIME = 430170
    ELAPSED_TIME = 459444
    OPTIMIZER_MODE = All_Rows
    OPTIMIZER_COST = 46
    USER_IO_WAIT_TIME = 0
    Est-ce qu'avec ses résultats, je peux dire que ID2 est meilleure que ID1 ?
    Comment doit on interpréter ces résultats (où je peux trouver les unités) ?
    C'est bizarre car en tps d'exécution, ID1 avait l'air d'être plus rapide mais je ne peux tester pour l'instant que sur des petites volumétries...

    Par contre, je voudrais faire un select des champs car j'ai du mal à m'y retrouver dans les champs de la vue...

    J'ai essayé de faire ça, mais j'ai une erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT CPU_TIME
    FROM V$SQLAREA V
    WHERE V.SQL_TEXT LIKE '%ID1%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%
    Voici l'erreur :
    ORA-01756 : une chaîne entre apostrophes ne se termine pas correctement
    Est-ce que par hasard tu sais pkoi il me mets ça ?

    Je te remercie pour ton aide.

    Tux

    PS : je suis en 10g

  4. #4
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 075
    Points
    19 075
    Par défaut
    il manque une appostrophe de fin de chaine à la fin de la requête

  5. #5
    Membre habitué Avatar de Loyd1974
    Profil pro
    Inscrit en
    Août 2007
    Messages
    176
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 176
    Points : 196
    Points
    196
    Par défaut
    Tout semble indiquer que, effectivement, l'ID2 est meilleure que l'ID1

    Mais, il faut que tu récupères les champs suivants pour être sûr :

    • Executions : qui te déterminera combien de fois la requête a été jouée, pour ensuite avoir la valeur unitaire de ta requête, il te faudra diviser les autres champ par ce nombre
    • Fetches : te détermine combien de ligne ont été retournées par la requête (peut être utile quand on a l'impression qu'une requête va plus vite qu'une autre et qu'on s'aperçoit qu'en fait, elle ne retourne pas autant de lignes finalement)
    • Disk_Reads : Détermine le nombre de bloc lu sur le disque (Lecture physique), unité : le bloc (vaut par défaut 8Kb, je crois, à vérifier)
    • Buffer_Gets : Détermine le nombre de bloc lu en mémoire (Lecture RAM), unité : le bloc comme Disk_Reads
    • CPU Time : le temps processeur utilisé pour cette requête, unité la µs (10E-6 secondes)
    • Elapsed Time : le temps total pour cette requête, unité µs
    Avec ces champs, tu couvres 90% des besoins d'analyse, ensuite, il faut connaître la situation en production, est-ce qu'il est plus important d'économiser le CPU ou les accès I/O ? Avec ces éléments et en connaissant la réponse à la dernière question, tu pourras déterminer quelle est la meilleure requête

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    100
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 100
    Points : 80
    Points
    80
    Par défaut
    Citation Envoyé par orafrance Voir le message
    il manque une appostrophe de fin de chaine à la fin de la requête
    la honte...
    il était tant que j'aille déjeuner !!


    Merci beaucoup Loyd1974 pour tes explications !

    Je mets en résolu car avec tout ça je devrais m'en sortir ! merci beaucoup !

    Tux

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 7
    Dernier message: 22/06/2007, 13h10
  2. [MySQL] temps d'ouverture d'une connexion VS temps d'exécution d'une requête
    Par epoz dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 25/04/2007, 19h06
  3. Calculer le temps d'exécution d'une requête
    Par BRAUKRIS dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 16/03/2007, 13h59
  4. [MySQL] Temps d'exécution d'une requête
    Par eon-of-the-scorn dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/07/2006, 12h06
  5. Affichage du temps d'exécution d'une requête
    Par milka dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 18h48

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