|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
bonsoir,
je voulais optimiser une requête de jointure multiple: en fait ma requte est la suivante: SELECT diag_libelle,diag_id, cons_date, pat_nom,hosp_dataini FROM diagnostique,consultation,patient,hospitalisation WHERE diag_id = cons_diag_id and cons_pat_id = pat_id and pat_id = hosp_pat_id and pat_id=1; --310786 rows selected. --Elapsed: 00:04:19.27 j'ai lu sur un site est que l'étape la plus intensive du processus de préparation SQL est la génération du plan d'exécution, notamment dans le cas d'une requête à jointures multiples (l'évaluation de toutes les combainisons de jointure possibles dans mon cas 4*3*2=24 permutation possible). donc j'ai pensé à travailler sur cet aspect . donc j'ai essayé ca: SELECT/*+ optimizer_max_permutation=1 */ diag_libelle,diag_id, cons_date, pat_nom,hosp_dataini FROM diagnostique,consultation,patient,hospitalisation-- WHERE diag_id = cons_diag_id and cons_pat_id = pat_id and pat_id = hosp_pat_id and pat_id=1; --310786 rows selected. --Elapsed: 00:04:25.17 le temps d'exécution de la requete augmente au lieu de diminuer j'ai même fixer le parametre optimizer_search_limit à 3 mais ce ci n'avait aucun impact. quelqu'un puisse m'expliquer que dois -je faire pour optimiser une telle requete. merci |
|
|
00
|
|
|
#2 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Vous empuntez le mauvais chemin ...
Les permutations permettront à l'optimiseur de trouver un meilleur choix indépendamment de l'ordre dans votre clause from. D'un autre côté, votre objectif doit être d'abord d'optimiser l'exécution et non la génération du plan d'exécution vu la durée de votre requête. Essayer de nous donner plus de détails sur vos tables et le plan d'exécution utilisé par Oracle en enlevant le hint sur les permutations |
|
|
00
|
|
|
#3 | ||||
|
Membre régulier
![]() |
Bonjour,
Je n'ai pas la maitrise du fonctionnel, mais j'ai l'impression qu'il y a une erreur sur les jointures de ta requête. tu fait Code :
Code :
Bon courage A+ |
||||
|
|
00
|
|
|
#4 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
bonjour,
merci d'abord de m'avoir répondu. voici ce que j'ai fait: SELECT diag_libelle,diag_id, cons_date, pat_nom,hosp_dataini FROM diagnostique,consultation,patient,hospitalisation WHERE diag_id = cons_diag_id and cons_pat_id = pat_id and pat_id = hosp_pat_id and pat_id=1; --310786 rows selected. --Elapsed: 00:02:07.09 vous remarquez ici que le temps d'exécution est diminué pourtant j'ai rien changé dans la requette ni dans la structure des tables. voici le plan d'exécution : ID OPERATION COST ---------- ------------------------------ ---------- 0 SELECT STATEMENT 359 1 HASH JOIN 359 2 TABLE ACCESS 11 3 MERGE JOIN 347 4 NESTED LOOPS 5 5 TABLE ACCESS 2 6 INDEX 1 7 TABLE ACCESS 3 8 BUFFER 344 9 TABLE ACCESS 9 j'ai réecris après la requete autrement: SELECT diag_libelle,diag_id, cons_date, pat_nom, hosp_dataini FROM diagnostique,consultation,patient,hospitalisation WHERE diag_id = cons_diag_id and cons_pat_id = pat_id and cons_pat_id = hosp_pat_id and pat_id=1; 310786 rows selected. Elapsed: 00:02:02.17 voici le plan d'exécution: ID OPERATION COST ---------- ------------------------------ ---------- 0 SELECT STATEMENT 29 1 HASH JOIN 29 2 NESTED LOOPS 15 3 NESTED LOOPS 13 4 TABLE ACCESS 2 5 INDEX 1 6 TABLE ACCESS 11 7 TABLE ACCESS 1 8 INDEX 0 9 TABLE ACCESS 13 pouvez vous m'expliquer ici pourquoi la valeur de cost s'est changé de cette manière pour l'opération de sélection et pour le NESTED LOOPS? et si j'ai bien compris ce que vous m'avez dit je dois d'abord réecrir la requete autrement jusqu'à avoir une plu performante et puis je peux agir sur le plan d'exécution. NB:voici les cardinalités des tables: patient 900 consultation 9982 diagnostique 30 hospitalisation 9825 |
|
|
00
|
|
|
#5 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
C'est illisible au niveau de la forme
Faudrait mettre les plan et les requêtes entre [ code ] et [ /code ] (sans les espaces). |
|
|
00
|
|
|
#6 | ||||||||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
ok
Code :
Code :
Code :
voici le plan d'exécution: Code :
et si j'ai bien compris ce que vous m'avez dit je dois d'abord réecrir la requete autrement jusqu'à avoir une plu performante et puis je peux agir sur le plan d'exécution. NB:voici les cardinalités des tables: patient 900 consultation 9982 diagnostique 30 hospitalisation 9825 |
||||||||
|
|
00
|
|
|
#7 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Encore une chose, En fait les noms des tables et les opérations exactes ne sont pas répertoriés dans votre plan puis l'indentation ou la filiation des opérations n'est pas présente ce qui rend difficile la compréhension du plan et puis la version Oracle.
Il est possible d'avoir le plan grâce à set autotrace de SQL*Plus ou explain plan et c'est expliqué ici |
|
|
00
|
|
|
#8 | ||||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
bonjour,
j'espère que c'est ca ce que manquait: pour la requete: Code :
Code :
je tiens à votre aide. merci |
||||
|
|
00
|
|
|
#9 | ||||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
pour la réecriture de le requete (requete2)
Code :
-00:03:46.24 -puis 00:04:14.38 -puis 00:02:50.53 cependant l'autre fois j'ai obtenu comme temps de réponse:00:02:02.17 je trouve aucune explication à ca pourtant le plan d'exécution reste toujours le meme: Code :
|
||||
|
|
00
|
|
|
#10 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Un autre point que j'ai oublié de préciser : laisser le paramètre optimizer_search_limit à sa valeur par défaut ...
|
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
c tout con mais je savais pas comment le faire.
nb: j'ai oublié de vous dire que je travaille sur oracle 10G. |
|
|
00
|
|
|
#12 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Enfin la version
Peux tu donner les index de tes tables sur les colonnes diag_id, cons_diag_id, cons_pat_id, pat_id, hosp_pat_id Sinon une requete lancée 1 fois, les données ne sont pas encore en mémoire (de la base ou du serveur), la seconde fois, les données peuvent être lues en mémoire => Accès plus rapide. Les stats sont elles à jour ?
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#13 | |||
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Citation:
Il y a un problème de produit cartésien entre ces 2 tables dans tous les cas. Si un patient à 3 entrées dans Consultation et 2 dans Hospitalisation, ca fera 6 lignes ! Donc je pense que d'essayer d'optimiser ça ne sert à rien, faut corriger la requete.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|||
|
|
00
|
|
|
#14 | ||||||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
bonjour,
ce qui concerne les index au début j'ai cru qu'oracle crée des index sur les clés primaires et étrangères de chaque table. Mais en listant les index sur mes tables j'ai trouvé qu'il y avait qu'un seul index sur chacune donc j'ai crée les index sur les clés étrangères: Code :
Code :
est ce que vous pouvez m'expliquer à quoi servent excatement les statistiques sur mes tables dans ce cas et est ce que à chaque fois que j'exécute ma requete je jois faire d'abord des satistiques sur mes tables: Code :
|
||||||
|
|
00
|
|
|
#15 | ||
|
Invité régulier
![]() Inscription : avril 2007 Messages : 18 ![]() |
pour le plan d'exécution de la première requete après avoir analyzer les tables:
Code :
En fait est ce que c'est possible de connaitre son continue?si oui comment svp ? merci |
||
|
|
00
|
|
|
#16 |
|
Expert Confirmé Sénior
![]() Inscription : juillet 2003 Messages : 3 453 ![]() |
Pour les stats, faut aller voir du côté de la faq ou des tuto DBA, doit y avoir un truc la dessus.
Si les données de ta table ne bougent pas, les stats ne bougent pas, donc pas besoin de les recalculer.
__________________
More Code : More Bugs. Less Code : Less Bugs |
|
|
00
|
|
|
#17 | |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
Citation:
|
|
|
|
00
|
|
|
#18 |
|
Membre éprouvé
![]() Inscription : décembre 2007 Messages : 354 ![]() |
En fait dans Oracle 10g, le paramètre optimizer_search_limit n'est pas un paramètre d'initialisation mais il y a un paramètre de session modifiable avec alter session. Il y a également maintenant un paramètre caché _optimizer_search_limit. Ma demande était une réponse à une info qui signalait que ce paramètre était modifié.
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com