|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 | ||||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Bonjour,
Je travaille sur une appli Web qui accède à une base oracle 10G sous Unix. J'ai un problème de performance sur la requête suivante : Code :
![]() La structure des tables concernée est : Code :
La volumétrie des tables est : PENSIONNE : 4.710.770 lignes SOUS_DOSSIER : 8.345.646 lignes DOCUMENT : 14.314.205 lignes ********************************************* Le plan d’exécution d'Oracle est : Plan hash value: 528657054
------------------------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes |TempSpc| Cost (%CPU)| Time |
------------------------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 305K| 32M| | 174K (1)| 00:32:00 |
| 1 | HASH UNIQUE | | 305K| 32M| 72M| 174K (1)| 00:32:00 |
|* 2 | HASH JOIN | | 305K| 32M| 65M| 161K (1)| 00:29:38 |
|* 3 | HASH JOIN | | 611K| 58M| 29M| 58175 (1)| 00:10:40 |
| 4 | TABLE ACCESS BY INDEX ROWID| PENSIONNE | 345K| 26M| | 23172 (1)| 00:04:15 |
|* 5 | INDEX RANGE SCAN | IN_PENSIONNE_SERV | 345K| | | 2769 (1)| 00:00:31 |
| 6 | TABLE ACCESS FULL | SOUS_DOSSIER | 8345K| 175M| | 18611 (2)| 00:03:25 |
|* 7 | TABLE ACCESS FULL | DOCUMENT | 4187K| 39M| | 94977 (1)| 00:17:25 |
------------------------------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("DOCUMENTCO2_"."ID_SOUS_DOSSIER"="SOUSDOSSIE1_"."ID_SOUS_DOSSIER")
3 - access("PENSIONNE0_"."ID_PENSIONNE"="SOUSDOSSIE1_"."ID_PENSIONNE")
5 - access("PENSIONNE0_"."ID_SERVICE"='059000')
7 - filter("DOCUMENTCO2_"."ID_TYPE_DOCUMENT"=10)Cette requête met plus de 50s pour s’exécuter, ce qui n'est pas acceptable pour les utilisateurs. Pourriez vous m'indiquer comment l'optimiser ? Merci d'avance pour votre aide ! |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() |
Votre colonne ID_TYPE_DOCUMENT est un nombre mais dans votre requête vous lui indiquez une chaîne de caractère : même si l'index était pertinent il n'est pas utilisé.
Globalement, la requête est mal écrite. Pour tester une existence, on utilise... EXISTS : Code :
__________________
Email : http://scr.im/waldar |
||
|
10
|
|
|
#3 |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Je vous remercie pour votre réponse.
Votre requête s’exécute en 25s, ce qui est mieux que 50s ! Cependant, la requête que j'ai postée étant générée automatiquement par Hibernate, je dois maintenant trouver comment forcer cette génération... Une petite remarque : Je n'ai pas vu de différences dans le plan d’exécution en passant un NUMBER plutôt qu'une chaine de caractère pour la colonne ID_TYPE_DOCUMENT |
|
|
00
|
|
|
#4 | ||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
L'indentation du plan d'exécution n'est pas claire. Je ne peux pas distinguer clairement quelle opération est fille et quelle opération est mère.
Pourriez vous exécuter de nouveau la requête en mettant au début de celle-ci le hint /*+ gather_plan_statistics */. Ensuite, immédiatement après l'exécution de la requête extraire son plan d'exécution à partir de la mémoire en faisant ceci Code :
Remarque : le distinct, est significatif d'un problème de design. |
||
|
|
00
|
|
|
#5 | ||||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Bonjour,
Voici le plan d'execution comme demandé : Code :
Code :
Merci par avance pour vos réponses et votre aide. |
||||
|
|
00
|
|
|
#6 | |||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#7 | |||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#8 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Code :
Code :
Combien de lignes sont produites par votre requête? 305.000? Si ce nombre est exact à quoi cela sert-il d'afficher 305.000 lignes aux yeux d'un être humain? |
||||
|
|
10
|
|
|
#9 | |
![]() ![]() |
Citation:
C'était peut-être pour le test cela dit.
__________________
Email : http://scr.im/waldar |
|
|
00
|
|
|
#10 | |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
L'interface de recherche permet une interrogation multi critères sur la base d'index. Seuls les 100 premiers résultats de la recherche sont proposés à l'utilisateur, qui peut alors affiner ses critères de recherche si nécessaire. |
|
|
|
00
|
|
|
#11 |
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Votre première requête utilise des jointures, la deuxième des jointures externes. Le résultat n'est pas identique.
|
|
|
00
|
|
|
#12 | |||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Code :
Attendons de voir si l'utilisation d'un index s'impose ou pas dans ce cas. Je pense. Aussi, qu'il ne selectionne que d'une seule table alors que la clause from en contient deux autres. Il est peut-ête plus judicieux dans ce cas d'utiliser des EXISTS, comme vous l'avez signalé. Il utilise aussi un order by alors que l'explain plan fourni ne montre ni une operation SORT ORDER BY ni NO SORT OPERATION en cas d'utilisation d'un index approprié pour éviter le tri. |
|||||
|
|
10
|
|
|
#13 | |||||
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
Code :
|
|||||
|
|
00
|
|
|
#14 |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Etrange : J'utilisais une vieille version de TOAD (V6.x) pour exécuter votre requête et elle ne ramenait aucune ligne. En utilisant TOAD V10 elle fonctionne parfaitement !
|
|
|
00
|
|
|
#15 | ||||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Voilà qui est bien.
12,52 secondes pour 18,44 secondes pour Code :
10 secondes pour Code :
En passant, vous disposez d'excellentes statistiques puisqu'Oracle est en train de faire d'excellentes estimations. Je vais consacrer encore un peu de temps pour voir si on peut quand même faire quelque chose. En effet selectionner 4.173.000 lignes en 12 secondes je me demande si ce n'est pas assez rapide |
||||
|
|
10
|
|
|
#16 | |
|
Invité de passage
![]() jean LAVALChef de projet NTIC Inscription : décembre 2011 Messages : 15 ![]() |
Citation:
Si oui, devons nous envisager une dé-normalisation si ces performances ne sont pas jugées acceptables ? Merci encore pour votre aide. Bien cordialement, J.Laval |
|
|
|
00
|
|
|
#17 | |||
![]() ![]() |
Citation:
DOCUMENT : 14.314.205 lignes TABLE ACCESS FULL | DOCUMENT | 1 | 4187K L'index sur DOCUMENT.IN_DOC_TYPEDOC n'est pas utilisé. C'est soit parce qu'il y a trop de IN_DOC_TYPEDOC à 10, soit parce que les stats ne reflètent pas la réalité. jalaval, que donne cette requête : Code :
__________________
Email : http://scr.im/waldar |
|||
|
00
|
|
|
#18 | |||
|
Membre expérimenté
![]() Mohamed HouriInscription : mars 2010 Messages : 286 ![]() |
Citation:
Code :
Quel pourcentage représentent ces 4.173.000 lignes par rapport au nombre total de lignes dans la table DOCUMENT? Mais comme E-Rows et A-Rows de cette opération sont pratiquement identiques ceci veut dire que le CBO a une bonne vue de la table et a bien estimé que l'utilisation de l'index n'est pas appropriée. |
|||
|
|
10
|
|
|
#19 | ||
|
Membre confirmé
![]() Grégoire MARTINIngénieur développement logiciels Inscription : janvier 2011 Messages : 128 ![]() |
Bonjour,
Un indicateur que j'utilise pour mesurer la pertinence d'un index est : Code :
PS : évidement tout ceci n'a de sens qu'une fois les stats calculées. PS2 : Quelqu'un sait il le seuil à partir duquel Oracle fait un FULL SCAN et quel parametre le régit ?
__________________
Cordialement. |
||
|
|
10
|
|
|
#20 | ||
|
Expert Confirmé Sénior
![]() ![]() Marius NituIngénieur développement logiciels Inscription : octobre 2007 Messages : 3 313 ![]() |
Citation:
Citation:
C'est un Hash Join parce qu’on estime que ça ramènera 305 K! Mais on en garde que 100! Peut être qu’en changeant de stratégie (= de requête) on pourrait gagner quelque chose de plus. |
||
|
|
10
|
Copyright © 2000-2012 - www.developpez.com