Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 31/08/2007, 11h40   #1
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Par défaut [Oracle 10g] Temps d'exécution d'une requête

Bonjour,

Je dois comparer 2 requêtes qui donne un résultat strictement équivalent au niveau données mais qui ont un temps d'exécution différent.

J'utilise SQL Scratchpad pour lancer les requêtes, il me fournit le temps d'exécution et je peux également obtenir le plan d'éxécution.

Mon problème est au niveau du temps d'exécution car celui n'ai quasiment jamais le même et comme je dois comparer les requêtes principalement à ce niveau là, c'est très difficile de savoir quelle requête est la plus performante.

Si je lance la requête pour la 1ère fois sous SQL Scratchpad (après ouverture d'Oracle Enterprise Manager), il n'y a pas eu de mise en mémoire tampon (je suppose) et c'est pourquoi elle est toujours plus longue.
Si je la relance tout de suite après elle est beaucoup plus rapide.
Etant donné que je lance plusieurs fois les requêtes, que je fais des modifications, puis que je les relance...

Comment faire pour vider cette mémoire tampon et avoir le temps réel que va mettre la requête ? car cette requête est utilisée pour une interface web et les utilisateurs veulent un résultat rapide à la première exécution.

Je fais régulièrement un
Code :
analyze TABLE contrat estimate statistics;
pour mettre à jour les stat.

Je vous remercie de votre aide.

Tux
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 11h44   #2
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Je ne pense pas que le temps d'exécution soit un bon critère, car il peut varier pour des raisons diverses.
Le mieux me semble de faire une trace et de l'analyser avec TKPROF, ou bien de te servir de la vue V$SQLAREA, suivant ta version d'Oracle

Tu pourras ainsi retrouver les consommations en terme de CPU, de mémoire et d'I/O et départager ainsi plus facilement tes requêtes

Si tu as accès à la vue v$SQLAREA, le plus simple est de rajouter un commentaire à ton select pour pouvoir l'identifier après:

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
-- 1ère Requête à analyser
SELECT /*ID1*/ ....
FROM ...
WHERE ...
 
-- 2nd requête à analyser
SELECT /*ID2*/ ...
FROM ...
WHERE ...
 
-- Recherche des requètes dans V$SQLAREA
-- la 1ère
SELECT *
FROM V$SQLAREA V
WHERE V.SQL_TEXT LIKE '%ID1%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%'
 
-- la 2nd
SELECT *
FROM V$SQLAREA V
WHERE V.SQL_TEXT LIKE '%ID2%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%'
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 12h27   #3
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Merci pour ta réponse.

J'ai fait ce que tu m'as dit ; j'ai accès à la vue en question, j'ai les infos.

Voici les résultats pour ID1 :
Citation:
CPU_TIME = 700163
ELAPSED_TIME = 773731
OPTIMIZER_MODE = All_Rows
OPTIMIZER_COST = 255
USER_IO_WAIT_TIME = 0
Pour ID2:
Citation:
CPU_TIME = 430170
ELAPSED_TIME = 459444
OPTIMIZER_MODE = All_Rows
OPTIMIZER_COST = 46
USER_IO_WAIT_TIME = 0
Est-ce qu'avec ses résultats, je peux dire que ID2 est meilleure que ID1 ?
Comment doit on interpréter ces résultats (où je peux trouver les unités) ?
C'est bizarre car en tps d'exécution, ID1 avait l'air d'être plus rapide mais je ne peux tester pour l'instant que sur des petites volumétries...

Par contre, je voudrais faire un select des champs car j'ai du mal à m'y retrouver dans les champs de la vue...

J'ai essayé de faire ça, mais j'ai une erreur:
Code :
1
2
3
SELECT CPU_TIME
FROM V$SQLAREA V
WHERE V.SQL_TEXT LIKE '%ID1%' AND V.SQL_TEXT NOT LIKE '%SQLAREA%
Voici l'erreur :
Citation:
ORA-01756 : une chaîne entre apostrophes ne se termine pas correctement
Est-ce que par hasard tu sais pkoi il me mets ça ?

Je te remercie pour ton aide.

Tux

PS : je suis en 10g
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 12h32   #4
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
il manque une appostrophe de fin de chaine à la fin de la requête
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 12h56   #5
Membre actif
 
Avatar de Loyd1974
 
Inscription : août 2007
Messages : 176
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 176
Points : 172
Points : 172
Tout semble indiquer que, effectivement, l'ID2 est meilleure que l'ID1

Mais, il faut que tu récupères les champs suivants pour être sûr :
  • Executions : qui te déterminera combien de fois la requête a été jouée, pour ensuite avoir la valeur unitaire de ta requête, il te faudra diviser les autres champ par ce nombre
  • Fetches : te détermine combien de ligne ont été retournées par la requête (peut être utile quand on a l'impression qu'une requête va plus vite qu'une autre et qu'on s'aperçoit qu'en fait, elle ne retourne pas autant de lignes finalement)
  • Disk_Reads : Détermine le nombre de bloc lu sur le disque (Lecture physique), unité : le bloc (vaut par défaut 8Kb, je crois, à vérifier)
  • Buffer_Gets : Détermine le nombre de bloc lu en mémoire (Lecture RAM), unité : le bloc comme Disk_Reads
  • CPU Time : le temps processeur utilisé pour cette requête, unité la µs (10E-6 secondes)
  • Elapsed Time : le temps total pour cette requête, unité µs
Avec ces champs, tu couvres 90% des besoins d'analyse, ensuite, il faut connaître la situation en production, est-ce qu'il est plus important d'économiser le CPU ou les accès I/O ? Avec ces éléments et en connaissant la réponse à la dernière question, tu pourras déterminer quelle est la meilleure requête
Loyd1974 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 31/08/2007, 13h42   #6
Membre du Club
 
Inscription : mai 2005
Messages : 91
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 91
Points : 40
Points : 40
Citation:
Envoyé par orafrance Voir le message
il manque une appostrophe de fin de chaine à la fin de la requête
la honte...
il était tant que j'aille déjeuner !!


Merci beaucoup Loyd1974 pour tes explications !

Je mets en résolu car avec tout ça je devrais m'en sortir ! merci beaucoup !

Tux
tux2005 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 23h54.


 
 
 
 
Partenaires

Hébergement Web