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?
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".
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:
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;
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.