Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement))
Merci pour votre aide,
Manu
Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement))
Merci pour votre aide,
Manu
Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
UniteRecherche.IDCentre_DepartementÎntreOnera_Departement.IDCentre_Departement))
Merci pour votre aide,
Manu
> j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement,
where Droit.IDUtilisateur=1
and ( ( Droit.IDDepartementÞpartement.IDDepartement
and
and
)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
)
)
> j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement,
where Droit.IDUtilisateur=1
and ( ( Droit.IDDepartementÞpartement.IDDepartement
and
and
)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
)
)
> j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement,
where Droit.IDUtilisateur=1
and ( ( Droit.IDDepartementÞpartement.IDDepartement
and
and
)
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
)
)
Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
Merci pour votre aide,
Manu
Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
Merci pour votre aide,
Manu
Bonjour,
j'ai un double probleme : tout d'abord (le moins grave) ma requete est
extremment gourmande : 6s de temps de réponse (depuis un serveur MySQL).
Mais ca, ce n est que depuis mon client MySQL.
Le plus embetant, est que lorsque que je teste cette meme requete avec
WD (clic droit "tester la requete"), eh bien, ... je ne connais pas le
temps, puisqu'apparement le distinct n est pas pris en compte et je ne l
ai pas laisser tourné jusqu au bout (apres 440 000 lignes, je me suis
dit qu il fallait pas faire surchauffer le serveur).
Donc voila la requete :
SELECT DISTINCT UniteRecherche.NomUR AS NomUR
from UniteRecherche, CentreOnera_Departement, Departement, CentreOnera,
Droit, Utilisateur, UniteDeTravail
where Droit.IDUtilisateur=1
and ((Droit.IDDepartementÞpartement.IDDepartement
and Departement.IDDepartementÎntreOnera_Departement.IDDepartement
and
or (Droit.IDCentreÎntreOnera.IDCentre
and CentreOnera.IDCentreÎntreOnera_Departement.IDCentre
and
Merci pour votre aide,
Manu
Bonjour,
effectivement la requete est sur 7 tables et les jointures ne sont pas
evidentes
a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
suivanteutiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
fermée) avec l'utilisation du USING (cle de jointure)
pourqoui ?
parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
travers
le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
tables, donc verifie au moins la coherence de la requete ex
SELECT *
FROM matable1 JOIN matable2 using (macleA,macleAA)
WHERE ......
si les tables ne sont pas jointes dans l'analyse correctement le moteur
MySQL vous le dira
ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
jointure est fausse
de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
ralenti enormement les requetes)
pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
qui remonte en 2 secondes ....
voila
le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
cohérence des requetes
je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
pour remonter le resultats
ensuite si le temps est plus important :
- verifier le nombre de lignes renvoyées et discuter de leur cohérence
(quel interets de renvoyer 3 miilions de lignes dans une table pour
l'utilisateur ? utiliser les LIMIT ?)
- verifier la requete par EXPLAIN
- verifier l'existance des index permettant cette requete de façon
optimal
voila
Bonjour,
effectivement la requete est sur 7 tables et les jointures ne sont pas
evidentes
a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
suivante
utiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
fermée) avec l'utilisation du USING (cle de jointure)
pourqoui ?
parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
travers
le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
tables, donc verifie au moins la coherence de la requete ex
SELECT *
FROM matable1 JOIN matable2 using (macleA,macleAA)
WHERE ......
si les tables ne sont pas jointes dans l'analyse correctement le moteur
MySQL vous le dira
ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
jointure est fausse
de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
ralenti enormement les requetes)
pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
qui remonte en 2 secondes ....
voila
le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
cohérence des requetes
je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
pour remonter le resultats
ensuite si le temps est plus important :
- verifier le nombre de lignes renvoyées et discuter de leur cohérence
(quel interets de renvoyer 3 miilions de lignes dans une table pour
l'utilisateur ? utiliser les LIMIT ?)
- verifier la requete par EXPLAIN
- verifier l'existance des index permettant cette requete de façon
optimal
voila
Bonjour,
effectivement la requete est sur 7 tables et les jointures ne sont pas
evidentes
a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
suivanteutiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
fermée) avec l'utilisation du USING (cle de jointure)
pourqoui ?
parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
travers
le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
tables, donc verifie au moins la coherence de la requete ex
SELECT *
FROM matable1 JOIN matable2 using (macleA,macleAA)
WHERE ......
si les tables ne sont pas jointes dans l'analyse correctement le moteur
MySQL vous le dira
ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
jointure est fausse
de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
ralenti enormement les requetes)
pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
qui remonte en 2 secondes ....
voila
le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
cohérence des requetes
je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
pour remonter le resultats
ensuite si le temps est plus important :
- verifier le nombre de lignes renvoyées et discuter de leur cohérence
(quel interets de renvoyer 3 miilions de lignes dans une table pour
l'utilisateur ? utiliser les LIMIT ?)
- verifier la requete par EXPLAIN
- verifier l'existance des index permettant cette requete de façon
optimal
voila
Excellents conseils de Firetox.
Un autre conseil : celui du mec un peu feignant et qui n'aime pas quand
ça commence à chauffer un peu trop sous son crane ...
Faire un mdb access; lier ses tables mysql. Faire sa requête avec le
requeteur graphique d'access en double cliquant sur les liens pour
définir le sens; tester puis pomper et adapter le code sql produit.
Ensuite essayer d'optimiser avec le EXPLAIN.
Firetox a présenté l'énoncé suivant :
> Bonjour,
>
> effectivement la requete est sur 7 tables et les jointures ne sont pas
> evidentes
> a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
> suivante
>
>> utiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
> fermée) avec l'utilisation du USING (cle de jointure)
>
> pourqoui ?
>
> parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
> travers
> le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
> tables, donc verifie au moins la coherence de la requete ex
>
> SELECT *
> FROM matable1 JOIN matable2 using (macleA,macleAA)
> WHERE ......
>
> si les tables ne sont pas jointes dans l'analyse correctement le moteur
> MySQL vous le dira
> ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
> jointure est fausse
>
> de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
> ralenti enormement les requetes)
> pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
> qui remonte en 2 secondes ....
>
> voila
>
> le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
> cohérence des requetes
> je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
> pour remonter le resultats
> ensuite si le temps est plus important :
>
> - verifier le nombre de lignes renvoyées et discuter de leur cohérence
> (quel interets de renvoyer 3 miilions de lignes dans une table pour
> l'utilisateur ? utiliser les LIMIT ?)
Oui mais attention car le LIMIT n'existe pas toujours sur tous les
SGBD. En oracle, ce genre de chose est hyper dur à faire.
> - verifier la requete par EXPLAIN
> - verifier l'existance des index permettant cette requete de façon
> optimal
>
> voila
>
--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Excellents conseils de Firetox.
Un autre conseil : celui du mec un peu feignant et qui n'aime pas quand
ça commence à chauffer un peu trop sous son crane ...
Faire un mdb access; lier ses tables mysql. Faire sa requête avec le
requeteur graphique d'access en double cliquant sur les liens pour
définir le sens; tester puis pomper et adapter le code sql produit.
Ensuite essayer d'optimiser avec le EXPLAIN.
Firetox a présenté l'énoncé suivant :
> Bonjour,
>
> effectivement la requete est sur 7 tables et les jointures ne sont pas
> evidentes
> a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
> suivante
>
>> utiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
> fermée) avec l'utilisation du USING (cle de jointure)
>
> pourqoui ?
>
> parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
> travers
> le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
> tables, donc verifie au moins la coherence de la requete ex
>
> SELECT *
> FROM matable1 JOIN matable2 using (macleA,macleAA)
> WHERE ......
>
> si les tables ne sont pas jointes dans l'analyse correctement le moteur
> MySQL vous le dira
> ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
> jointure est fausse
>
> de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
> ralenti enormement les requetes)
> pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
> qui remonte en 2 secondes ....
>
> voila
>
> le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
> cohérence des requetes
> je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
> pour remonter le resultats
> ensuite si le temps est plus important :
>
> - verifier le nombre de lignes renvoyées et discuter de leur cohérence
> (quel interets de renvoyer 3 miilions de lignes dans une table pour
> l'utilisateur ? utiliser les LIMIT ?)
Oui mais attention car le LIMIT n'existe pas toujours sur tous les
SGBD. En oracle, ce genre de chose est hyper dur à faire.
> - verifier la requete par EXPLAIN
> - verifier l'existance des index permettant cette requete de façon
> optimal
>
> voila
>
--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)
Excellents conseils de Firetox.
Un autre conseil : celui du mec un peu feignant et qui n'aime pas quand
ça commence à chauffer un peu trop sous son crane ...
Faire un mdb access; lier ses tables mysql. Faire sa requête avec le
requeteur graphique d'access en double cliquant sur les liens pour
définir le sens; tester puis pomper et adapter le code sql produit.
Ensuite essayer d'optimiser avec le EXPLAIN.
Firetox a présenté l'énoncé suivant :
> Bonjour,
>
> effectivement la requete est sur 7 tables et les jointures ne sont pas
> evidentes
> a determiner. c'est pour ca que je conseil a mes programmeurs la mthodologie
> suivante
>
>> utiliser les LEFT JOIN ou JOIN (suivant si c'est une jointure ouverte ou
> fermée) avec l'utilisation du USING (cle de jointure)
>
> pourqoui ?
>
> parceque avec cette syntaxe il n'est pas possible de fair eune jointure de
> travers
> le moteur MySQL verifie dans cette syntaxe si les cle existe dans les
> tables, donc verifie au moins la coherence de la requete ex
>
> SELECT *
> FROM matable1 JOIN matable2 using (macleA,macleAA)
> WHERE ......
>
> si les tables ne sont pas jointes dans l'analyse correctement le moteur
> MySQL vous le dira
> ex : la colonne macleAA n'existe pas dans la table matable2 : dans ce cas la
> jointure est fausse
>
> de meme ca evite les jointure entre table sur des cle d'une autre (ce qui
> ralenti enormement les requetes)
> pour exemple : j'ai une requete sur 7 table dont 1 avec 80 million de lignes
> qui remonte en 2 secondes ....
>
> voila
>
> le SQL c'est bien , mais ATTENTION les résultats sont dependant de la
> cohérence des requetes
> je pars du principe qu'une requetes ne doit mettre plus de 1 à 2 seconde
> pour remonter le resultats
> ensuite si le temps est plus important :
>
> - verifier le nombre de lignes renvoyées et discuter de leur cohérence
> (quel interets de renvoyer 3 miilions de lignes dans une table pour
> l'utilisateur ? utiliser les LIMIT ?)
Oui mais attention car le LIMIT n'existe pas toujours sur tous les
SGBD. En oracle, ce genre de chose est hyper dur à faire.
> - verifier la requete par EXPLAIN
> - verifier l'existance des index permettant cette requete de façon
> optimal
>
> voila
>
--
Eric Roumegou
http://cerbermail.com/?TSoulBerPA
(cliquez sur le lien ci-dessus pour me contacter en privé)