optimisation d'une requete de jointure multiple
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
optimisation d'une requete de jointure multiple
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