web-dev-qa-db-fra.com

Recherche du temps d'exécution d'une requête à l'aide de SQL Developer

Je suis débutant avec Oracle DB. Je veux connaître le temps d'exécution d'une requête. Cette requête renvoie environ 20 000 enregistrements. Quand je vois le développeur SQL, il ne montre que 50 lignes, maximum ajustable à 500. Et en utilisant F5 jusqu'à 5000.

Je l'aurais fait en apportant des modifications à l'application, mais le redéploiement de l'application n'est pas possible car il s'exécute en production. Donc, je suis limité à utiliser uniquement SQL Developer. Je ne sais pas comment obtenir les secondes passées pour l'exécution de la requête? Toute idée à ce sujet m'aidera. Je vous remercie.

Cordialement, JE

11
java_enthu

Si vous faites défiler vers le bas après les 50 lignes initialement renvoyées, il récupère davantage. Quand je veux tous, je clique simplement sur le premier des 50, puis j'appuie sur CtrlEnd pour faire défiler jusqu'en bas.

Cela mettra à jour l'affichage de l'heure qui a été utilisée (juste au-dessus des résultats, il dira quelque chose comme "Toutes les lignes récupérées: 20000 en 3,606 secondes") vous donnant un temps précis pour la requête complète.

14
user2404501

Si votre relevé fait partie d'une application déjà déployée et si vous disposez des droits d'accès à la vue V$SQLAREA , vous pouvez vérifier le nombre de EXECUTIONS et CPU_TIME. Vous pouvez rechercher l'instruction à l'aide de SQL_TEXT:

SELECT CPU_TIME, EXECUTIONS 
  FROM V$SQLAREA
 WHERE UPPER (SQL_TEXT) LIKE 'SELECT ... FROM ... %';

Il s'agit de la manière la plus précise de déterminer la durée d'exécution réelle. La vue V$SESSION_LONGOPS pourrait également vous intéresser.

Si vous n'avez pas accès à ces vues, vous pouvez également utiliser une boucle de curseur pour parcourir tous les enregistrements, par exemple.

CREATE OR REPLACE PROCEDURE speedtest AS
   count number;

   cursor c_cursor is
     SELECT ...;
BEGIN
   -- fetch start time stamp here
   count := 0;

   FOR rec in c_cursor
   LOOP
     count := count +1;
   END LOOP;   
   -- fetch end time stamp here
END;

Selon l'architecture, cela peut être plus ou moins précis, car les données peuvent devoir être transmises au système sur lequel s'exécute votre SQL.

4
Trinimon

Vous pouvez modifier ces limites; mais vous utiliserez un certain temps dans le transfert de données entre la base de données et le client, et éventuellement pour l'affichage; et cela à son tour serait affecté par le nombre de lignes tirées par chaque extraction. Ces éléments affectent également votre application, donc regarder le temps d'exécution brut peut ne pas vous raconter toute l'histoire de toute façon.

Pour modifier la limite de la feuille de calcul (F5), accédez à Outils-> Préférences-> Base de données-> Feuille de calcul et augmentez la valeur 'Nombre max de lignes à imprimer dans un script' (et peut-être 'Lignes max dans la sortie du script'). Pour modifier la taille de récupération, allez dans le panneau Base de données-> Avancé dans les préférences; peut-être pour correspondre à la valeur de votre application.

Ce n'est pas parfait, mais si vous ne voulez pas voir les données réelles, obtenez simplement le temps nécessaire à l'exécution dans la base de données, vous pouvez encapsuler la requête pour obtenir une seule ligne:

select count(*) from (
  <your original query
);

Il exécutera normalement l'intégralité de la requête d'origine, puis comptera les résultats, ce qui n'ajoutera rien de significatif à l'heure. (Il est possible que cela puisse réécrire la requête en interne, je suppose, mais je pense que c'est peu probable, et vous pouvez utiliser des astuces pour l'éviter si nécessaire).

2
Alex Poole