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

PL/SQL Oracle Discussion :

Procédure qui affiche le temps d'une requête


Sujet :

PL/SQL Oracle

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut Procédure qui affiche le temps d'une requête
    bonjour à tous,je dois créer une procédure qui reçoit en paramètres une requête sql et ma procédure doit afficher son temps d'exécution en minutes,secondes,millisecondes.J'ai testé la fonction get_time mais j'ai un problème voici ma procédure incomplète.--->
    create procedure test (param in varchar2) is
    v_start number;
    v_stop number;
    begin
    v_start:=dbms_utility.get_time;
    -- j'execute ma requête recu en paramètres
    v_stop:=dbms_output.get_time;
    dbms_output.put_line(v_stop - v_start)--> ca me retourne 0
    end;

    Pouvez vous m'expliquer pourquoi le temps est identique pour les 2 ?? et si vous avez une solution je suis preneur!! Merci

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Août 2005
    Messages
    270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 270
    Points : 342
    Points
    342
    Par défaut
    Citation Envoyé par chris_013 Voir le message
    bonjour à tous,je dois créer une procédure qui reçoit en paramètres une requête sql et ma procédure doit afficher son temps d'exécution en minutes,secondes,millisecondes.J'ai testé la fonction get_time mais j'ai un problème voici ma procédure incomplète.--->
    create procedure test (param in varchar2) is
    v_start number;
    v_stop number;
    begin
    v_start:=dbms_utility.get_time;
    -- j'execute ma requête recu en paramètres
    v_stop:=dbms_output.get_time;
    dbms_output.put_line(v_stop - v_start)--> ca me retourne 0
    end;

    Pouvez vous m'expliquer pourquoi le temps est identique pour les 2 ?? et si vous avez une solution je suis preneur!! Merci
    ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    desole je me suis trompé en tapant c bien dbms_utility sue j'ai dans mon code. pouvez vous m'aider?

  4. #4
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    SQL> declare
      2    v_start number;
      3    v_stop number;
      4  begin
      5    v_start:=dbms_utility.get_time;
      6    -- j'execute ma requete recu en parametres
      7    for i in 1 .. 10000000 loop
      8      null;
      9    end loop;
     10    v_stop:=dbms_utility.get_time;
     11    dbms_output.put_line(v_stop - v_start);
     12  end;
     13  /
    97
    Citation Envoyé par chris_013 Voir le message
    Pouvez vous m'expliquer pourquoi le temps est identique pour les 2 ?? et si vous avez une solution je suis preneur!! Merci
    Parce que la requête est vite? Comment tu la lance?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    via la commande EXECUTE IMMEDIATE...ce qui est bizarre c'est que quand j'active le set timing on pour la requete il m'affiche au moins quelques millisecondes mais lorsque je la teste dans ma procédure les temps start et stop sont identiques

  6. #6
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par chris_013 Voir le message
    via la commande EXECUTE IMMEDIATE...ce qui est bizarre c'est que quand j'active le set timing on pour la requete il m'affiche au moins quelques millisecondes mais lorsque je la teste dans ma procédure les temps start et stop sont identiques
    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
    SQL> set timing on
    SQL> set serveroutput on
    SQL> 
    SQL> declare
      2    v_start number;
      3    v_stop number;
      4  begin
      5    v_start:=dbms_utility.get_time;
      6    -- j'execute ma requete recu en parametres
      7    for i in 1 .. 10000000 loop
      8      null;
      9    end loop;
     10    v_stop:=dbms_utility.get_time;
     11    dbms_output.put_line(v_stop - v_start);
     12  end;
     13  /
    85
     
    Uplynulo: 00:00:00.88
    88 ms - c'est le temps du côté du client
    = temps d'exécution sur serveur (85 ms) + communication client-serveur + ...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    j' ai testé votre procédure avec une requête -> il me retourne bien le temps que la procédure dure mais pas celui de la requête j'ai testé la requete hors procédure elle me retourne 00:00:00:09.
    j'exécute cette requête dans la procédure et elle me retourne comme nombre-> 48... je ne comprend pas?? Ou alors je convertis mal ma réponse en millisecondes ou alors je ne vois vraiment pas.. Merci pou votre aide!!!

  8. #8
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par chris_013 Voir le message
    j' ai testé votre procédure avec une requête -> il me retourne bien le temps que la procédure dure mais pas celui de la requête j'ai testé la requete hors procédure elle me retourne 00:00:00:09.
    j'exécute cette requête dans la procédure et elle me retourne comme nombre-> 48... je ne comprend pas?? Ou alors je convertis mal ma réponse en millisecondes ou alors je ne vois vraiment pas.. Merci pou votre aide!!!
    Sans code (ou l'exemple) ce n'est pas possible trouver le problème (S'il existe). Quelle requête as tu?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    create or replace function xdelay return number is
    begin
      for i in 1 .. 100000000 loop
        null;
      end loop;
      return 1;
    end;
    /
    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
    SQL> declare
      2    v_start number;
      3    v_stop number;
      4    v_dummy number;
      5  begin
      6    v_start:=dbms_utility.get_time;
      7    -- j'execute ma requete recu en parametres
      8    execute immediate 'select xdelay from dual' into v_dummy;
      9    v_stop:=dbms_utility.get_time;
     10    dbms_output.put_line(v_stop - v_start);
     11  end;
     12  /
    804
    
    Uplynulo: 00:00:08.07
    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
    create or replace procedure ppp is
      v_start number;
      v_stop number;
      v_dummy number;
    begin
      v_start:=dbms_utility.get_time;
      -- j'execute ma requete recu en parametres
      execute immediate 'select xdelay from dual' into v_dummy;
      v_stop:=dbms_utility.get_time;
      dbms_output.put_line(v_stop - v_start);
    end;
    /
    
    SQL> exec ppp
    727
    Uplynulo: 00:00:07.30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SQL> select xdelay from dual;
    
       XDELAY
    ---------
            1
    
    Uplynulo: 00:00:06.93
    Le temps oscille entre 5 et 11 secondes chez moi.

  9. #9
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Uplynulo = le temps passé

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    j'ai une table personne avec un id,un nom et un prenom--> je fais un select * from personne (hors procédure) j'obtiens grâce au set timing on 00:00:00.04
    et dans la procédure la valeur renvoyée est 0. est ce du au fait que la valeur 00.04 est beaucoup trop basse??? le set timing renvoie bien heures,minutes,secondes et millisecondes???

  11. #11
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par chris_013 Voir le message
    j'ai une table personne avec un id,un nom et un prenom--> je fais un select * from personne (hors procédure) j'obtiens grâce au set timing on 00:00:00.04
    et dans la procédure la valeur renvoyée est 0. est ce du au fait que la valeur 00.04 est beaucoup trop basse???

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    declare
      c number;
    begin
      c := 0;
      for r in (select * from dba_objects) loop
        c := c + 1;
      end loop;
      dbms_output.put_line ('xxx: '|| to_char (c));
    end;
    /
    xxx: 22118
    passé: 00:00:01.28
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select * from dba_objects;
    .....
    SYS                            WRH$_DB_CACHE_ADVICE_PK                                  
             48941 INDEX PARTITION     13.12.08 13.12.08 2008-12-13:01:24:36 VALID   N N N
    .....
    22118 lignes
    passé: 00:00:57.21
    - une seconde pour passer par les résultats sur serveur
    - une minute pour afficher les résultats sur client

    Citation Envoyé par chris_013 Voir le message
    le set timing renvoie bien heures,minutes,secondes et millisecondes???
    oui

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    je viens de tester aussi cette requête en dehors et dans une procédure et hors procédure j'ai 00:00:35:67 et dans une procédure j'ai 00:00:00:79 ca n'a rien a voir .. Comment pourrais -je vraiment obtenir le temps de ma requête si quand j'exécute ma requête dans une procédure sont temps d' exécution est 35 fois plus petit??? j'avoue je suis un peu perdu..

  13. #13
    Membre actif Avatar de DAB.cz
    Inscrit en
    Octobre 2006
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 221
    Points : 249
    Points
    249
    Par défaut
    Citation Envoyé par chris_013 Voir le message
    je viens de tester aussi cette requête en dehors et dans une procédure et hors procédure j'ai 00:00:35:67 et dans une procédure j'ai 00:00:00:79 ca n'a rien a voir .. Comment pourrais -je vraiment obtenir le temps de ma requête si quand j'exécute ma requête dans une procédure sont temps d' exécution est 35 fois plus petit??? j'avoue je suis un peu perdu..
    Et c'est quoi le temps de la requête?
    Pour le serveur, c'est moins que 1 seconde (trace + tkprof):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    select * 
    from
     dba_objects
     
     
    call     count       cpu    elapsed       disk      query    current        rows
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    Parse        1      0.00       0.09          0          0          0           0
    Execute      1      0.00       0.00          0          0          0           0
    Fetch     1476      0.82       0.79          0      10323          0       22118
    ------- ------  -------- ---------- ---------- ---------- ----------  ----------
    total     1478      0.82       0.89          0      10323          0       22118
    Mais pour qu'on puisse voir toutes les lignes, il faut les transmettre à client et afficher dans la fenêtre - et ça dure 1 minute (= le temps de "set timing on").
    Claire.

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    148
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 148
    Points : 44
    Points
    44
    Par défaut
    Donc si je comprend bien le véritable temps d'exécution d'une requête c'est le temps pour qu'elle s'exécute sur le serveur??Et ca sera presque toujours que quelques millisecondes??

Discussions similaires

  1. Réponses: 9
    Dernier message: 09/05/2012, 22h38
  2. Réponses: 3
    Dernier message: 26/09/2011, 21h27
  3. Temps d'une requête
    Par Oberown dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 04/04/2006, 11h18
  4. appel d'une procédure qui renvoie le résultat d'une requete
    Par audreyc dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 16/03/2006, 14h02
  5. [MySQL] Une liste déroulante affichant les données d'une requête SHOW par ordre alphabétique
    Par jack_1981 dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 22/12/2005, 15h53

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