|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
Bonjour,
Je travaille sur Oracle 10i. Je cherche à optimiser une requête d'insertion de données dans une table temporaire en vue d'une application web. Voici ma requête initiale : Citation:
Les données servant à alimenter cette table sont issues d'une requête de sélection (en vert) relativement coûteuse en temps d'exécution : environ 25 secondes. J'ai réussi à optimiser nettement cette requête en utilisant une expression de table commune, autrement dit une syntaxe du type : Citation:
Tout content, je me dis qu'il ne me reste alors qu'à rajouté le insert into pour alimenter ma table temporaire : Code :
Autant dire que l'utilisation de la clause WITH devient inutile ! J'ai beau cherché, je ne comprends pas pourquoi l'alimentation de la table induit un tel temps d'exécution alors que la seule sélection avec la clause WITH permet un gain de temps considérable par rapport à la requête initiale !? Quelqu'un peut-il me donner une solution ou au moins une explication ? PS : pour plus de renseignement sur l'utilisation de la clause WITH, vous pouvez aller voir ici : http://www.ianywhere.com/developer/p...s-5414852.html et http://www.ianywhere.com/developer/p...s-7010660.html Je rentre bien dans les cas d'utilisation de cette clause et rien n'indique que ça induit un temps d'exécution plus long pour le cas de l'INSERT... |
||||
|
|
00
|
|
|
#2 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
et bien le problème vient donc de l'écriture et non de la lecture. Vérifie les attentes sur la session (v$session_wait) pour voir si ça vient des indexes, contraintes, latch, lock, redo, undo, etc...
|
|
|
00
|
|
|
#3 | ||
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
Citation:
Citation:
|
||
|
|
00
|
|
|
#4 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
de toute façon, le WITH ne sert à rien dans ton exemple... après, sans les waits ou les explain plan je vois mal comment on pourrait t'aider
|
|
|
00
|
|
|
#5 | |
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
Citation:
Le but est donc bien établi : optimiser le temps d'exécution ! |
|
|
|
00
|
|
|
#6 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
S'il y a un changement dans le temps d'exécution c'est qu'il y a un problème sur la base à mon avis... le WITH ne peut avoir un intérêt que si tu réutilises l'alias dans la requête
|
|
|
00
|
|
|
#7 | ||||||||
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
C'est vrai que mes exemples simplifiés ne permettent pas vraiment de visualiser le problème.
Voici donc la requête (de test) d'origine (sans WITH) :Code :
et son EXPLAIN PLAN : Code :
et la requête (de test toujours) avec le WITH :Code :
Code :
Comme je l'ai déjà dit, je suis pas expert Oracle... donc la lecture de l'explain plan ne m'apprend pas grand chose Si ça vous permet de m'éclairer |
||||||||
|
|
00
|
|
|
#8 | ||
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
Pour la requête de sélection avec le WITH (donc juste sans INSERT INTO SIH_CARTE_SIG), voici l'EXPLAIN PLAN :
Code :
|
||
|
|
00
|
|
|
#9 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
donc tu vois bien que le plan d'exécution ne change pas... le problème vient donc surement des waits
|
|
|
00
|
|
|
#10 |
|
Invité régulier
![]() Inscription : mars 2007 Messages : 15 ![]() |
Ok.
![]() Et comment faire pour voir ça ? Ou est-ce qu'on peut voir comment sont positionnés les wait ? |
|
|
00
|
|
|
#11 |
![]() ![]() Inscription : janvier 2004 Messages : 15 861 ![]() |
v$session_wait pendant l'exécution ou une trace
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com