Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Ordre d'évaluation des critères dans un requête SQL

1 réponse
Avatar
Jerome VERITE
Bonjour,

je cherche à exécuter une requête SQL dans une base access, mais j'éprouve
certaines difficultés. Ma requête fonctionne mais elle met un temps
inacceptable à s'exécuter.

Voici ma requête pour expliquer un peu tout ca

SELECT LIBELLE, M1.IDPARENT, M1.VALEUR AS V1, M2.VALEUR AS V2, M3.VALEUR AS
V3, M4.VALEUR AS V4
FROM METARE1LISTE, MDTYPE2 AS M1, MDTYPE2 AS M2, MDTYPE2 AS M3, MDTYPE2 AS
M4
WHERE M1.MOT = LIBELLE AND M1.IDMD = 3 AND M2.MOT = LIBELLE AND M2.IDMD = 4
AND M3.MOT = LIBELLE AND M3.IDMD = 5 AND M4.MOT = LIBELLE AND M4.IDMD = 6
AND M2.IDPARENT = M1.IDPARENT AND M3.IDPARENT = M1.IDPARENT AND M4.IDPARENT
= M1.IDPARENT
ORDER BY LIBELLE, M2.VALEUR, M1.VALEUR DESC , M4.VALEUR;

pour préciser mon problème, je dirai que la table MDTYPE2 contient 250
enregistrements. Ce n'est donc pas sa taille qui ralentit le tout. Je
présume en fait qu'access cherche à évaluer ces critères "M2.IDPARENT =
M1.IDPARENT AND M3.IDPARENT = M1.IDPARENT AND M4.IDPARENT = M1.IDPARENT" en
premier, auquel cas, il va faire des combinaisons revenant à croiser 250^4
enregistrements ce qui expliquerait le ralentissement. alors que s'il
évaluait les critères du genre de M1.IDMD = 3 en premier, il ne conservait à
chaque fois que 3 ou 4 enregistrements pour M1, M2, M3 et M4 qu'il pourrait
ensuite croiser. dans cette hypothèse au lieu de chercher à croiser 250^4
lignes soit a peu pres 4 milliards, il n'en croiserait que 4^4=256.

Ma question est donc. Est-il possible de forcer l'ordre de gestion des
critères pour accélérer l'exécution de ma requête? Ou alors, ids-je
n'importe quoi ?

Merci d'avance pour votre aide

Jérôme

1 réponse

Avatar
Jerome VERITE
J'ai trouvé, désolé de vous avoir dérangé.

il fallait faire des sous requêtes.

Select t1.libelle,v1,v2,v3,v4 from
(SELECT LIBELLE, IDPARENT, VALEUR AS V1 FROM METARE1LISTE, MDTYPE2 WHERE MOT
= LIBELLE AND IDMD = 3) as T1,
(SELECT LIBELLE, IDPARENT, VALEUR AS V2 FROM METARE1LISTE, MDTYPE2 WHERE MOT
= LIBELLE AND IDMD = 4) as T2,
(SELECT LIBELLE, IDPARENT, VALEUR AS V3 FROM METARE1LISTE, MDTYPE2 WHERE MOT
= LIBELLE AND IDMD = 5) as T3,
(SELECT LIBELLE, IDPARENT, VALEUR AS V4 FROM METARE1LISTE, MDTYPE2 WHERE MOT
= LIBELLE AND IDMD = 6) as T4
where t2.idparent = t1.idparent and t3.idparent = t1.idparent and
t4.idparent = t1.idparent


Jérôme

"Jerome VERITE" a écrit dans le message de
news:
Bonjour,

je cherche à exécuter une requête SQL dans une base access, mais j'éprouve
certaines difficultés. Ma requête fonctionne mais elle met un temps
inacceptable à s'exécuter.

Voici ma requête pour expliquer un peu tout ca

SELECT LIBELLE, M1.IDPARENT, M1.VALEUR AS V1, M2.VALEUR AS V2, M3.VALEUR
AS

V3, M4.VALEUR AS V4
FROM METARE1LISTE, MDTYPE2 AS M1, MDTYPE2 AS M2, MDTYPE2 AS M3, MDTYPE2 AS
M4
WHERE M1.MOT = LIBELLE AND M1.IDMD = 3 AND M2.MOT = LIBELLE AND M2.IDMD 4
AND M3.MOT = LIBELLE AND M3.IDMD = 5 AND M4.MOT = LIBELLE AND M4.IDMD = 6
AND M2.IDPARENT = M1.IDPARENT AND M3.IDPARENT = M1.IDPARENT AND
M4.IDPARENT

= M1.IDPARENT
ORDER BY LIBELLE, M2.VALEUR, M1.VALEUR DESC , M4.VALEUR;

pour préciser mon problème, je dirai que la table MDTYPE2 contient 250
enregistrements. Ce n'est donc pas sa taille qui ralentit le tout. Je
présume en fait qu'access cherche à évaluer ces critères "M2.IDPARENT > M1.IDPARENT AND M3.IDPARENT = M1.IDPARENT AND M4.IDPARENT = M1.IDPARENT"
en

premier, auquel cas, il va faire des combinaisons revenant à croiser 250^4
enregistrements ce qui expliquerait le ralentissement. alors que s'il
évaluait les critères du genre de M1.IDMD = 3 en premier, il ne conservait
à

chaque fois que 3 ou 4 enregistrements pour M1, M2, M3 et M4 qu'il
pourrait

ensuite croiser. dans cette hypothèse au lieu de chercher à croiser 250^4
lignes soit a peu pres 4 milliards, il n'en croiserait que 4^4%6.

Ma question est donc. Est-il possible de forcer l'ordre de gestion des
critères pour accélérer l'exécution de ma requête? Ou alors, ids-je
n'importe quoi ?

Merci d'avance pour votre aide

Jérôme