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

requete sur une suite de requete => lenteur

11 réponses
Avatar
eric.zzzz
Bonjour,
Je suis sous Access 2003.
Mes requetes sont souvent bas=E9es sur des requetes qui, elles-m=EAme sont
bas=E9es sur des requetes, etc... (la table de d=E9part d=E9passe 40 000
lignes).Lorsque la cha=EEne de sous-requetes d=E9passe 5 ou 6 requetes,
l'ex=E9cution est tr=E8s lente.
A d=E9faut de solution, pour =E9viter ces lenteurs, je cr=E9e une nouvelle
base dans laquelle il n'y a que la derni=E8re requete bas=E9e sur une
table qui est une importation de la derni=E8re sous-requete.
Existe-t-il d'autres m=E9thodes pour =E9viter ces lenteurs ?
Merci d'avance
Eric

10 réponses

1 2
Avatar
Michel__D
Bonjour,

Il faudrait voir les requêtes.

PS:Tout le traitement s'effectue en local ?


a écrit dans le message de news:
Bonjour,
Je suis sous Access 2003.
Mes requetes sont souvent basées sur des requetes qui, elles-même sont
basées sur des requetes, etc... (la table de départ dépasse 40 000
lignes).Lorsque la chaîne de sous-requetes dépasse 5 ou 6 requetes,
l'exécution est très lente.
A défaut de solution, pour éviter ces lenteurs, je crée une nouvelle
base dans laquelle il n'y a que la dernière requete basée sur une
table qui est une importation de la dernière sous-requete.
Existe-t-il d'autres méthodes pour éviter ces lenteurs ?
Merci d'avance
Eric
Avatar
eric.zzzz
On 20 fév, 13:04, "Michel__D"
wrote:
Bonjour,

Il faudrait voir les requêtes.

PS:Tout le traitement s'effectue en local ?


Oui, en local...
J'ai une vingtaine de requetes, tyu veux les voir toutes ? voilà un
exemple :
SELECT SousReq1.DIPLOME_PRE, SousReq1.LIBELLE_LONG_200, SousReq1.
[2006], SousReq2.[2006], SousReq1.[2007], SousReq2.[2007], SousReq1.
[2008], SousReq2.[2008]
FROM SousReq1 INNER JOIN SousReq2 ON SousReq1.DIPLOME_PRE =
SousReq2.DIPLOME_PRE;

SousReq1 = TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
SELECT Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
FROM Terminants2 INNER JOIN V_FormDiplOct2008 ON
Terminants2.DIPLOME_PRE = V_FormDiplOct2008.FORMATION_DIPLOME
WHERE (((Terminants2.KSIQ)="5"))
GROUP BY Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200,
Terminants2.KSIQ
PIVOT Terminants2.ANNEE;

SousReq2 = TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
SELECT Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
FROM Terminants2 INNER JOIN V_FormDiplOct2008 ON
Terminants2.DIPLOME_PRE = V_FormDiplOct2008.FORMATION_DIPLOME
GROUP BY Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
PIVOT Terminants2.ANNEE;

SELECT SousReq1.DIPLOME_PRE, SousReq1.LIBELLE_LONG_200, SousReq1.
[2006], SousReq2.[2006], SousReq1.[2007], SousReq2.[2007], SousReq1.
[2008], SousReq2.[2008]
FROM SousReq1 INNER JOIN SousReq2 ON SousReq1.DIPLOME_PRE =
SousReq2.DIPLOME_PRE;

Cette dernière requete va servir avec une autre à créer une autre
requete, etc...
Avatar
Michel__D
Bonjour,

a écrit :
On 20 fév, 13:04, "Michel__D"
wrote:
Bonjour,

Il faudrait voir les requêtes.

PS:Tout le traitement s'effectue en local ?


Oui, en local...
J'ai une vingtaine de requetes, tyu veux les voir toutes ? voilà un
exemple :
SELECT SousReq1.DIPLOME_PRE, SousReq1.LIBELLE_LONG_200, SousReq1.
[2006], SousReq2.[2006], SousReq1.[2007], SousReq2.[2007], SousReq1.
[2008], SousReq2.[2008]
FROM SousReq1 INNER JOIN SousReq2 ON SousReq1.DIPLOME_PRE > SousReq2.DIPLOME_PRE;

SousReq1 = TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
SELECT Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
FROM Terminants2 INNER JOIN V_FormDiplOct2008 ON
Terminants2.DIPLOME_PRE = V_FormDiplOct2008.FORMATION_DIPLOME
WHERE (((Terminants2.KSIQ)="5"))
GROUP BY Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200,
Terminants2.KSIQ
PIVOT Terminants2.ANNEE;

SousReq2 = TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
SELECT Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
FROM Terminants2 INNER JOIN V_FormDiplOct2008 ON
Terminants2.DIPLOME_PRE = V_FormDiplOct2008.FORMATION_DIPLOME
GROUP BY Terminants2.DIPLOME_PRE, V_FormDiplOct2008.LIBELLE_LONG_200
PIVOT Terminants2.ANNEE;

SELECT SousReq1.DIPLOME_PRE, SousReq1.LIBELLE_LONG_200, SousReq1.
[2006], SousReq2.[2006], SousReq1.[2007], SousReq2.[2007], SousReq1.
[2008], SousReq2.[2008]
FROM SousReq1 INNER JOIN SousReq2 ON SousReq1.DIPLOME_PRE > SousReq2.DIPLOME_PRE;

Cette dernière requete va servir avec une autre à créer une autre
requete, etc...



Regarde si avec ce qui suit, il y a une amélioration (j'ai pas testé).

La requête qui prépare nommé "ReqPrepare" :

SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
Sum(T1.POND) AS SommeDePOND
FROM Terminants2 AS T1
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
UNION
SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
FROM Terminants2 AS T1
WHERE T1.KSIQ="5"
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

Et la requête qui devrait fournir le même résultat que ta
dernière requête :

TRANSFORM First(T1.SommeDePOND) AS Valeur
SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
FROM ReqPrepare AS T1 INNER JOIN V_FormDiplOct2008 AS T2
ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
PIVOT T1.ANNEE & "_" & T1.ChampPivot;
Avatar
eric.zzzz
On 21 fév, 14:25, Michel__D
wrote:

Regarde si avec ce qui suit, il y a une amélioration (j'ai pas testé) .

La requête qui prépare nommé "ReqPrepare" :

SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
  Sum(T1.POND) AS SommeDePOND
FROM Terminants2 AS T1
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
UNION
SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
FROM Terminants2 AS T1
WHERE T1.KSIQ="5"
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

Et la requête qui devrait fournir le même résultat que ta
  dernière requête :

TRANSFORM First(T1.SommeDePOND) AS Valeur
SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
FROM ReqPrepare AS T1 INNER JOIN V_FormDiplOct2008 AS T2
ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
PIVOT T1.ANNEE & "_" & T1.ChampPivot;- Masquer le texte des messages pr écédents -

- Afficher le texte des messages précédents -



OK; je testerais ça lundi au boulot
Avatar
eric.zzzz
On 21 fév, 20:49, wrote:
On 21 fév, 14:25, Michel__D
wrote:
> Regarde si avec ce qui suit, il y a une amélioration (j'ai pas test é).

> La requête qui prépare nommé "ReqPrepare" :

> SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
>   Sum(T1.POND) AS SommeDePOND
> FROM Terminants2 AS T1
> GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
> UNION
> SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
> FROM Terminants2 AS T1
> WHERE T1.KSIQ="5"
> GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

> Et la requête qui devrait fournir le même résultat que ta
>   dernière requête :

> TRANSFORM First(T1.SommeDePOND) AS Valeur
> SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
> FROM ReqPrepare AS T1 INNER JOIN V_FormDiplOct2008 AS T2
> ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
> GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
> PIVOT T1.ANNEE & "_" & T1.ChampPivot;- Masquer le texte des messages pr écédents -



ça marche, mais pourquoi TRANSFORM First(...) ? ça à l'air de marcher
aussi avec TRANSFORM Sum(...)
Avatar
Michel__D
Bonjour,

a écrit dans le message de news:
On 21 fév, 20:49, wrote:
On 21 fév, 14:25, Michel__D
wrote:
> Regarde si avec ce qui suit, il y a une amélioration (j'ai pas testé).

> La requête qui prépare nommé "ReqPrepare" :

> SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
> Sum(T1.POND) AS SommeDePOND
> FROM Terminants2 AS T1
> GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
> UNION
> SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
> FROM Terminants2 AS T1
> WHERE T1.KSIQ="5"
> GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

> Et la requête qui devrait fournir le même résultat que ta
> dernière requête :

> TRANSFORM First(T1.SommeDePOND) AS Valeur
> SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
> FROM ReqPrepare AS T1 INNER JOIN V_FormDiplOct2008 AS T2
> ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
> GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
> PIVOT T1.ANNEE & "_" & T1.ChampPivot;- Masquer le texte des messages précédents -



ça marche, mais pourquoi TRANSFORM First(...) ? ça à l'air de marcher
aussi avec TRANSFORM Sum(...)

Réponse :
Car le Sum(...) a déja été réalisé et il s'agit juste de modifier la façon
d'afficher les données (vertical => horizontal).

PS:En fait toute les fonctions de regroupement sont utilisables puisqu'il
n'y a qu'une valeur qui est concernée pour "l'intersection".

Par contre d'exécution de la requête est-elle plus rapide ?
Avatar
eric.zzzz
On 23 fév, 12:44, "Michel__D"
wrote:
Bonjour,

Par contre d'exécution de la requête est-elle plus rapide ?- Masquer le texte des messages précédents -



J'ai l'impression, mais je ne suis pas sûr car je t'ai donné un
exemple simple. Si tu veux, je t'envoie enprivé un cas beaucoup +
complexe et là, je pourrais vraiment voir si c'est plus rapide...
Avatar
Michel__D
Bonjour,

Disons que je t'ai donné un autre axe pour construire les requêtes, à toi
d'essayer de l'appliquer si c'est possible à tes autres requêtes sinon
sans aucune garantie de réponse (je suis trés occupé) tu peux envoyer
à l'adresse michel-douillardAROBASEwanadoo.fr


a écrit dans le message de news:
On 23 fév, 12:44, "Michel__D"
wrote:
Bonjour,

Par contre d'exécution de la requête est-elle plus rapide ?- Masquer le texte des messages précédents -



J'ai l'impression, mais je ne suis pas sûr car je t'ai donné un
exemple simple. Si tu veux, je t'envoie enprivé un cas beaucoup +
complexe et là, je pourrais vraiment voir si c'est plus rapide...
Avatar
eric.zzzz
On 24 fév, 10:37, "Michel__D"
wrote:
Bonjour,

Disons que je t'ai donné un autre axe pour construire les requêtes, à toi
 d'essayer de l'appliquer si c'est possible à tes autres requêtes s inon
 sans aucune garantie de réponse (je suis trés occupé) tu peux en voyer
 à l'adresse michel-douillardAROBASEwanadoo.fr



Oui, bien sûr que ce que tu m'as donné va beaucoup me servir...
Avatar
Michel__D
Bonjour,

a écrit :
> Bonjour
>
> Il n'y a pas d'urgence...Fais ce que tu peux;... ce que tu m'as donné
> m'a bcp servi
>
> Je cherche à avoir le taux d'emploi par diplome.
> La difficulté vient du fait qu'il ne faut retenir que les
> enregistrements qui sont > 34 par année (Count(DIPLOME_PRE)>34) et il
> faut que la somme des enregistrements sur les 3 années (2006, 2007 et
> 2008) soit > 120
> C'est pour cela que j'ai procédé en plusieurs étapes, d'où trop de
> requetes => lenteur.
>
>
>
> I) 1re étape: Exclusion des enregistrements <35 et dont le total <120
>
>
> req1.1 : je crée "Req1" qui exclut les enregistrements <35 :
> SELECT Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Sum(Terminants2.POND) AS SommeDePOND, Count(Terminants2.DIPLOME_PRE) AS
> CompteDeDIPLOME_PRE, Terminants2.ANNEE
> FROM Terminants2
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Terminants2.ANNEE HAVING (((Count(Terminants2.DIPLOME_PRE))>34));
>
>
>
> req 1.2 : Avec "Req1", je crée une req croisée par année "Req2":
> TRANSFORM Sum(Req1.CompteDeDIPLOME_PRE)
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
>
>
>
> req 1.3 : Avec "Req2", j'exclus les enregistrements <120 sur les 3
> années => "Req3" :
> SELECT Req2.DIPLOME_PRE, Req2.LIBELLE_LONG_200, Req2.[2006],
> Req2.[2007], Req2.[2008], [2006]+[2007]+[2008] AS total
> FROM Req2
> WHERE ((([2006]+[2007]+[2008])>120))
> ORDER BY Req2.DIPLOME_PRE;
>
> Avec cette 1re sous-requete "Req3", je n'ai pas l'info essentielle qui
> est le champ "POND"; je n'ai fait pour l'instant qu'exclure les
> enregistrements qui ne m'interessent pas.
>
>
>
> II) 2me étape : traitement de l'info "POND"
> req 2.1 : Avec "Req1", je crée une req croisée par année "Req4" :
> TRANSFORM Sum(Req1.SommeDePOND) AS SommeDePOND
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> PIVOT Req1.ANNEE;
>
>
>
> III) 3me étape : Jointure entre 1re et 2me étape ("Req3" avec "Req4" qui
> donnent "Req5") pour ne retenir que les données POND qui correspondent à
> mes critères de la 1re étape
> SELECT Req4.* FROM Req4 INNER JOIN Req3 ON Req4.DIPLOME_PRE > Req3.DIPLOME_PRE;
>
>
>
> IV) 4° étape : requete qui me donnent ceux qui sont en emploi =>"Req6"
> TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
> SELECT Terminants2.DIPLOME_PRE
> FROM Terminants2
> WHERE (((Terminants2.KSIQ)="3"))
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.KSIQ
> PIVOT Terminants2.ANNEE;
>
>
>
> V) Ultime étape : le taux d'emploi (jointure entre 3° et 4° étape)
> SELECT Req6.DIPLOME_PRE, Req6.LIBELLE_LONG_200, Req6.[2006],
> Req5.[2006], Req6.[2007], Req5.[2007], Req6.[2008], Req5.[2008]
> FROM Req6 INNER JOIN Req5 ON Req6.DIPLOME_PRE = Req5.DIPLOME_PRE;
>
> Merci beaucoup
>
> Eric

Regarde si les 3 requêtes suivantes te donne le résultat souhaité :

Req1:
SELECT T2.[DIPLOME_PRE]
FROM [SELECT T1.ANNEE, T1.[DIPLOME_PRE],
Count(T1.[DIPLOME_PRE] AS CompteDe
FROM Terminants2 AS T1
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
HAVING Count(T1.[DIPLOME_PRE])>34]. AS T2
WHERE T2.ANNEE Between 2006 And 2008
GROUP BY T2.[DIPLOME_PRE]
HAVING Sum(T2.CompteDe)>120;

Req2:
SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
Sum(T1.POND) AS SommeDePOND
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
UNION
SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
WHERE T1.KSIQ="3"
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];

TRANSFORM First(T1.SommeDePOND) AS Valeur
SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
FROM Req2 AS T1 INNER JOIN V_FormDiplOct2008 AS T2
ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
PIVOT T1.ANNEE & "_" & T1.ChampPivot;
1 2