web-dev-qa-db-fra.com

Temps d'exécution des requêtes Oracle

Je voudrais obtenir le temps d'exécution de la requête dans Oracle. Je ne veux pas du temps dont Oracle a besoin pour imprimer les résultats - juste du temps d'exécution.

Dans MySQL, il est facile d'obtenir le temps d'exécution à partir du shell.

Comment puis-je le faire dans SQL * Plus?

29
user429743

On peut lancer la commande SQL * Plus SET TIMING ON pour obtenir des heures d'horloge murale, mais on ne peut pas, par exemple, extraire le temps de cela trivialement.

Le paramètre AUTOTRACE, lorsqu'il est 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, qui la supprimera.

Enfin, on peut tracer la session SQL * Plus et calculer manuellement le temps d'attente sur des événements qui sont des attentes client, comme "SQL * Net message to client", "SQL * Net message from client".

25
Adam Musch

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és.

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

Référence:

18
OMG Ponies
select LAST_LOAD_TIME, ELAPSED_TIME, MODULE, SQL_TEXT elapsed from v$sql
  order by LAST_LOAD_TIME desc

Exemple plus compliqué (n'oubliez pas 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;
7
gavenkoa

Je recommanderais de regarder des lectures/lectures cohérentes comme un meilleur proxy pour le "travail" que le temps d'exécution. Le temps d'exécution peut être faussé par ce qui se passe d'autre sur le serveur de base de données, la quantité de contenu dans le cache, etc.

Mais si vous voulez VRAIMENT du temps d'exécution SQL, la vue V $ SQL a à la fois CPU_TIME et ELAPSED_TIME.

3
Gary Myers