2010-08-24 10 views
21

Je souhaite obtenir l'heure d'exécution de la requête dans Oracle. Je ne veux pas le temps qu'Oracle a besoin pour imprimer les résultats - juste le temps d'exécution.Heure d'exécution de la requête Oracle

En MySQL, il est facile d'obtenir le temps d'exécution depuis le shell.

Comment faire cela dans SQL * Plus?

Répondre

19

Vous pouvez exécuter la commande SQL * Plus SET TIMING ON pour obtenir des heures d'horloge murale, mais vous ne pouvez pas, par exemple, extraire du temps de façon triviale. Le paramètre AUTOTRACE, utilisé comme SET AUTOTRACE TRACEONLY supprimera la sortie, mais effectuera tout le travail pour satisfaire la requête et renvoyer les résultats à SQL * Plus, ce qui le supprimera. Enfin, on peut suivre la session SQL Plus, et calculer manuellement le temps passé à attendre sur les événements qui sont des attentes client, tels que "SQL Message Net au client", "Message SQL * Net du client".

13

Utilisation:

set serveroutput on 
variable n number 
exec :n := dbms_utility.get_time; 
select ...... 
exec dbms_output.put_line((dbms_utility.get_time-:n)/100) || ' seconds....'); 

Ou peut-être:

SET TIMING ON; 

-- do stuff 

SET TIMING OFF; 

... pour obtenir les centièmes de secondes qui se sont écoulées.

Dans les deux cas, le temps écoulé peut être affecté par le chargement du serveur/etc.

Référence:

2

Je recommande regarder cohérente obtient/logique se lit comme un meilleur indicateur de 'travail' que le temps d'exécution. Mais si vous voulez VRAIMENT un temps d'exécution SQL, la vue V $ SQL a à la fois CPU_TIME et ELAPSED_TIME.

+0

également parce que SQL peut être partagé, vous devez aussi regarder le nombre d'exécutions et de diviser ce au travail en moyenne sinon vous trouverez l'ELAPSED_TIME pour toutes les exécutions et vous vous demanderez peut-être pourquoi un simple SQL de 1 seconde a consommé des heures de temps écoulé. – Stellios

5
select LAST_LOAD_TIME, ELAPSED_TIME, MODULE, SQL_TEXT elapsed from v$sql 
    order by LAST_LOAD_TIME desc 

Plus compliqué par exemple (ne pas oublier de supprimer ou de remplacer PATTERN):

select * from (
    select LAST_LOAD_TIME, to_char(ELAPSED_TIME/1000, '999,999,999.000') || ' ms' as TIME, 
     MODULE, SQL_TEXT from SYS."V_\$SQL" 
    where SQL_TEXT like '%PATTERN%' 
    order by LAST_LOAD_TIME desc 
) where ROWNUM <= 5;