Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD > PHP & MySQL
PHP & MySQL Forum d'entraide sur les fonctions MySQL avec PHP. Avant de poster -> FAQ MySQL, Cours MySQL et Sources MySQL. Pour les questions concernant le moteur MySQL plutôt que les fonctions PHP, merci d'utiliser le forum MySQL.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/09/2011, 22h38   #1
Membre régulier
 
Inscription : janvier 2004
Messages : 228
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 228
Points : 70
Points : 70
Par défaut SQL_BIG_SELECTS en haut de page

Dans quelques fichiers de mon application, certaines requetes sont copieuses (peut-etre mal ficelée)

Cela se traduit à ce jour sur quelques rares serveurs par un

The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET SQL_MAX_JOIN_SIZE=# if the SELECT is okay

La solution de facilité pour moi est de placer au debut de chacune de mes pages php ceci :
Code :
1
2
3
 
$requete = "SET SQL_BIG_SELECTS=1";
$result = mysql_query($requete, $conn) or die(mysql_error());
Si cela resoud le problème, y at-il des contre indications à procéder de la sorte ?
Merci à tous.
pierre50 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/09/2011, 11h51   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 323
Points : 18 323
Envoyer un message via MSN à CinePhil
Étant donné certaines requêtes complexes que j'ai effectuées et le fait que je n'ai jamais rencontré ce message d'erreur, j'aimerais bien voir une requête qui le provoque. Il y a probablement moyen de l'optimiser.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 17h11   #3
Membre régulier
 
Inscription : janvier 2004
Messages : 228
Détails du profil
Informations forums :
Inscription : janvier 2004
Messages : 228
Points : 70
Points : 70
Par exemple ce style de requete

Code :
1
2
3
4
5
6
7
$query_RsInvite = sprintf("
SELECT DISTINCT gic_ID, nom_classe, nom_matiere, cdt_classe$num_archive.ID_classe,cdt_matiere$num_archive.ID_matiere 
FROM cdt_agenda$num_archive, cdt_classe$num_archive, cdt_matiere$num_archive 
WHERE `prof_ID` =%s 
AND cdt_classe$num_archive.ID_classe = cdt_agenda$num_archive.classe_ID 
AND cdt_matiere$num_archive.ID_matiere = cdt_agenda$num_archive.matiere_ID 
ORDER BY gic_ID, cdt_classe$num_archive.nom_classe, cdt_matiere$num_archive.nom_matiere ", $profchoix_RsInvite);
Cette requete passe bien sur 99,5 % des serveurs

ou celle-ci pour laquelle l'erreur sera identique

Code :
1
2
3
4
5
6
7
8
9
10
$query_res2 = sprintf("SELECT DISTINCT nom_classe,ID_classe FROM cdt_classe,cdt_emploi_du_temps,cdt_groupe_interclasses,cdt_groupe_interclasses_classe WHERE 
cdt_emploi_du_temps.classe_ID=0
AND
cdt_emploi_du_temps.prof_ID=%s
AND
cdt_emploi_du_temps.gic_ID=cdt_groupe_interclasses.ID_gic
AND
cdt_groupe_interclasses.ID_gic=cdt_groupe_interclasses_classe.gic_ID
AND
cdt_groupe_interclasses_classe.classe_ID=cdt_classe.ID_classe  ORDER BY nom_classe ASC",$_SESSION['ID_prof']);
Un SET SESSION SQL_BIG_SELECTS=1 peut-il avoir des dommages collatéraux ?

Merci pour votre aide
pierre50 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 18h33   #4
Membre confirmé
 
Inscription : juillet 2011
Messages : 146
Détails du profil
Informations personnelles :
Localisation : France

Informations forums :
Inscription : juillet 2011
Messages : 146
Points : 253
Points : 253
En général si sur le serveur tu as des limitation de la sorte c'est qu'il y a des raisons

Ou des soucis de configuration.

Sur le serveur qui te sort l'erreur fait un

Code :
SELECT @@SQL_MAX_JOIN_SIZE;
pour voir la valeur qui est mise.

Si la valeur est elevée mais que tu as quand même l'erreur qui se produit alors c'est que tes requêtes renvoient bcp trop de ligne et que tu peut les optimiser.

Si la valeur est trop basse et que tu ne peut optimiser tes requêtes, alors tu n'aura pas trop le choix, mais sache qu'en général cela va devoir créer des tables temporaires sur disques pour tes jointures avec toutes les lenteurs qui vont en découler.
Tolriq est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/09/2011, 22h52   #5
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 11 029
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 11 029
Points : 18 323
Points : 18 323
Envoyer un message via MSN à CinePhil
Dans la première requête, il n'y a que deux jointures, ce n'est vraiment pas beaucoup !
Les colonnes figurant dans les conditions de jointures sont-elles indexées ?

La seconde requête contient trois jointures, ce qui n'est guère plus ! Donc même question.

De plus...
1) Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN.

2) L'utilisation d'alias rend les requêtes beaucoup plus agréables à lire.

Vos requêtes récrites :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT DISTINCT gic_ID, nom_classe, nom_matiere, c.ID_classe, m.ID_matiere 
FROM cdt_agenda$num_archive a
INNER JOIN cdt_classe$num_archive c ON c.ID_classe = a.classe_ID
INNER JOIN cdt_matiere$num_archive m ON m.ID_matiere = a.matiere_ID
WHERE prof_ID = %s 
ORDER BY gic_ID, c.nom_classe, m.nom_matiere
 
SELECT DISTINCT nom_classe, ID_classe 
FROM cdt_classe c
INNER JOIN cdt_groupe_interclasses_classe ic ON ic.classe_ID = c.ID_classe
    INNER JOIN cdt_groupe_interclasses i ON i.ID_gic = ic.gic_ID
        INNER JOIN cdt_emploi_du_temps t ON t.gic_ID = i.ID_gic
WHERE t.classe_ID = 0
    AND t.prof_ID = %s
ORDER BY nom_classe ASC
il y manque encore des alias devant des noms de colonnes mais je ne peux pas deviner à quelles tables appartiennent ces colonnes.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h02.


 
 
 
 
Partenaires

Hébergement Web