11
votes

Mesurer le temps d'une instruction SQL dans une procédure dans PLSQL

Je dois écrire une procédure qui enregistre l'heure d'exécution de toute instruction SQL dans une table.

La procédure appelle par EXEC Mesureqltime ("État SQL en chaîne ');

Mon idée est comme ceci: xxx

mais cela n'a pas fonctionné pour moi pour un SELECT * ... Clause. (Je pense que SQL Besoin d'une commande dans la commande)

est un moyen d'exécuter des comptations SQL dans une procédure?


0 commentaires

4 Réponses :


16
votes

Si votre instruction SQL est une sélection, vous devez extraire du curseur pour avoir une mesure significative de son temps d'exécution.

Si vous n'agissez pas du curseur, vous ne mesurez que le temps passé dans les phases "analyses" et "exécution", alors que la plupart des travaux sont généralement effectués dans la phase "Fetch" pour sélectionner des déclarations.

Vous ne pourrez pas récupérer avec exécuter immédiatement ou Ouvrir le curseur pour "chaîne" Si vous ne connaissez pas le nombre de colonnes, l'instruction réelle sera ont. Vous devrez utiliser le package SQL dynamique dbms_sql < / a> si le nombre / type de colonnes de la sélection est inconnu.

Voici un exemple: xxx

Notez que cela mesurera le temps nécessaire chercher à la dernière ligne du SELECT.



1
votes

Pour calculer la durée d'un temps d'exécution

PROCEDURE MY_PROCEDURE IS
  timeStart  TIMESTAMP;
  timeEnd    TIMESTAMP;
BEGIN
  timeStart  := SYSTIMESTAMP;

  -- YOUR CODE HERE

  timeEnd    := SYSTIMESTAMP;

  INSERT INTO PROC_RUNTIMES (PROC_NAME, START_TIME, END_TIME)
    VALUES ('MY_PROCEDURE ', timeStart  , timeEnd    );
END MY_PROC;


0 commentaires

4
votes

Compléter Devosjava répondit ... Évitez d'l'utiliser à Dawn; P

PROCEDURE MY_PROCEDURE IS
  timeStart  TIMESTAMP;
  timeEnd    TIMESTAMP;
  timeSecond NUMBER
BEGIN
  timeStart  := SYSTIMESTAMP;

  -- YOUR CODE HERE

  timeEnd    := SYSTIMESTAMP;
  timeSecond :=((extract(hour from timeEnd)*3600)+(extract(minute from timeEnd)*60)+extract(second from timeEnd))-((extract(hour from timeStart)*3600)+(extract(minute from timeStart)*60)+extract(second from timeStart));
  dbms_output.put_line('finished: '||timeSecond||' seconds');
END MY_PROC;


1 commentaires

Timesecond: = extrait (deuxième de Timeend - TimeStart);



0
votes

Insérer dans proc_runtimes (proc_Name, start_time, fin_time) Valeurs ('PROC_NAME', TO_CHAR (Sysdate, 'jj / mm / aaaa HH24: MI: SS'), NULL);

votre requête ici;

Insérer dans proc_runtimes (proc_Name, start_time, fin_time) Valeurs ('PROC_NAME', NULL, TO_CHAR (Sysdate, 'jj / mm / yyyy HH24: MI: SS'));


0 commentaires