Ordre d'évaluation des critères dans un requête SQL
1 réponse
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 ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
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
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" <veritejeromeENTROP@wanadoo.fr> a écrit dans le message de
news:u8QOjQ6IEHA.3032@TK2MSFTNGP09.phx.gbl...
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 ?
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 ?