IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Administration MySQL Discussion :

Comment corriger une erreur de MAX_JOIN_SIZE ?


Sujet :

Administration MySQL

  1. #1
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Comment corriger une erreur de MAX_JOIN_SIZE ?
    BOnjour,

    je gère un site qui a depuis peu une erreur que je ne comprends pas car la gestion du site ne demande pas du tout de connaissance sql ou mysql (oscommerce pour ceux qui connaissent). Mais lorsqu'il y a un petit soucis comme c'est le cas actuellement je suis bien embête.

    Pourriez vous m'aider à au moins "traduire" ce que me dit l'erreur ?

    Merci d'avance:


    1104 - 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

    select count(distinct p.products_id) as total from products p left join manufacturers m using(manufacturers_id) left join specials s on p.products_id = s.products_id left join tax_rates tr on p.products_tax_class_id = tr.tax_class_id left join zones_to_geo_zones gz on tr.tax_zone_id = gz.geo_zone_id and (gz.zone_country_id is null or gz.zone_country_id = '0' or gz.zone_country_id = '73') and (gz.zone_id is null or gz.zone_id = '0' or gz.zone_id = '0'), products_description pd where p.products_status = '1' and p.products_id = pd.products_id and pd.language_id = '1' and (IF(s.status, s.specials_new_products_price, p.products_price) * if(gz.geo_zone_id is null, 1, 1 + (tr.tax_rate / 100) ) >= 20) and (IF(s.status, s.specials_new_products_price, p.products_price) * if(gz.geo_zone_id is null, 1, 1 + (tr.tax_rate / 100) ) <= 30)

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Peux-tu tester la requête suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     select @@SQL_SAFE_UPDATES ;
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Ajout des balises "quote"
    BOnjour,
    désolé de la réponse tardive j'étais en déplacement.
    APrès avoir tapé ta requète voilà ce que j'ai eu:

    serveur:...
    base de donnée:...
    Généré le : Mar 13 Janvier 2009 à 11:26
    Généré par: phpMyAdmin 2.10.0.2 / MySQL 5.0.45-Debian_1ubuntu3.3-log
    requête SQL: SELECT @@SQL_SAFE_UPDATES ;
    Enregistrements: 1
    @@SQL_SAFE_UPDATES
    0
    A savoir que le message d'erreur est apparu sans que je fasse quoi que ce soit sur la base.
    Les seules choses qui se produisent tous les jours sont:
    - des clients qui s'inscrivent
    - des clients qui commandes
    - des produits que je mets.

    Normalement j'ai ce message 1104 (la première partie) lorsqu'il y a trop de commandes stockées.
    J'en supprime et il disparait. HOrs ici rien n'y faît.
    Je dois donc atteindre un maximum fixé par mon hébergeur à savoir online.

    Lorsque je leur ai demandé à combien était fixés les max join size ils m'ont dit :

    mysql> SHOW VARIABLES LIKE 'max_join_size';
    +---------------+--------+
    | Variable_name | Value |
    +---------------+--------+
    | max_join_size | 300000 |
    +---------------+--------+
    SI ça peut aider

    Merci en tous les cas.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Pas d'idée pour ce qui me concerne. Je suis assez surpris, parce que dans ce que j'avais compris de la doc, le MAX_JOIN_SIZE n'intervenait qu'en cas de @@SQL_SAFE_UPDATES... mais j'ai dû rater un truc
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci en tous les cas.

    Je sais que j'en demande beaucoup mais serait il possible de m'indiquer "comme à un imbécile" ce que veut dire ce qui est indiqué sur le message d'erreur ?

    A savoir que je pour moi c'est du chinois.

    Merci d'avance sinon merci quand même

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Je n'y comprends pas plus que toi...

    Essaie de passer SET SQL_BIG_SELECTS=1 juste avant ta requête...
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre éprouvé
    Avatar de Sivrît
    Profil pro
    Inscrit en
    Février 2006
    Messages
    953
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2006
    Messages : 953
    Points : 1 249
    Points
    1 249
    Par défaut
    Déjà j'ai réécrit la requête pour vérifier qu'une jointure ne part pas de travers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    SELECT COUNT(DISTINCT p.products_id) AS total
    FROM      products             p
    LEFT JOIN manufacturers        m  USING(manufacturers_id)
    LEFT JOIN specials             s  ON p.products_id           = s.products_id
    LEFT JOIN tax_rates            tr ON p.products_tax_class_id = tr.tax_class_id
    LEFT JOIN zones_to_geo_zones   gz ON tr.tax_zone_id          = gz.geo_zone_id
                                     AND (gz.zone_country_id IS NULL OR gz.zone_country_id = '0' OR gz.zone_country_id = '73')
                                     AND (gz.zone_id         IS NULL OR gz.zone_id         = '0' OR gz.zone_id = '0'),
         JOIN products_description pd ON p.products_id = pd.products_id
    WHERE p.products_status = '1'
      AND pd.language_id = '1'
      AND (IF(s.status, s.specials_new_products_price, p.products_price) * IF(gz.geo_zone_id is null, 1, 1 + (tr.tax_rate / 100) ) >= 20)
      AND (IF(s.status, s.specials_new_products_price, p.products_price) * IF(gz.geo_zone_id is null, 1, 1 + (tr.tax_rate / 100) ) <= 30)
    Ça m'a l'air d'aller.

    Citation Envoyé par Antoun Voir le message
    Pas d'idée pour ce qui me concerne. Je suis assez surpris, parce que dans ce que j'avais compris de la doc, le MAX_JOIN_SIZE n'intervenait qu'en cas de @@SQL_SAFE_UPDATES... mais j'ai dû rater un truc
    Citation Envoyé par Antoun Voir le message
    Essaie de passer SET SQL_BIG_SELECTS=1 juste avant ta requête...
    J'ai fait quelques tests. SQL_SAFE_UPDATES=0 n'empêche pas l'erreur, mais SQL_BIG_SELECTS=1 si.

    Citation Envoyé par gounico Voir le message
    Je sais que j'en demande beaucoup mais serait il possible de m'indiquer "comme à un imbécile" ce que veut dire ce qui est indiqué sur le message d'erreur ?
    MAX_JOIN_SIZE indique le nombre maximum d'enregistrements que MySQL va passer en revue avant de laisser tomber et de sortir cette erreur. Je pense que c'est une protection contre les requêtes qui partent en sucette, genre jointures sur 6 grosses tables sans index, ou pire, sans critère de jointure (produit cartésien de la mort quoi).

    D'après mes tests, ce sont vraiment les enregistrements considérés qui sont comptés (après, pour savoir précisément ce que ça recouvre, par exemple avec de sous requêtes, il faudrait voir sous le capot).
    Par exemple, un "count(*)" qui ne retourne qu'une ligne mais doit en compter plein va coincer. Une grosse jointure peut poser problème sans index mais passer avec car le nombre d'enregistrement auxquels accéder pour filtrer chute radicalement.

    Du coup MAX_JOIN_SIZE à 300000, c'est un peu juste. Mais on peut le changer à chaud pour la session. Détail intéressant (ou perturbant, c'est selon), si on le baisse et que l'on rejoue une requête qui est dans le query cache, ça marche.


    La requête est assez complexe. Peut-être que mysql se perd et n'utilise pas un index, ou alors qu'il en manque un.


    Citation Envoyé par gounico Voir le message
    Normalement j'ai ce message 1104 (la première partie) lorsqu'il y a trop de commandes stockées.
    J'en supprime et il disparait. Hors ici rien n'y faît.
    Dans ce cas, les commandes semblent ne pas intervenir, donc ce serait plutôt trop de produits, fabricants, rabais, etc... Cela dit pour atteindre 300000... Ça sent quand même le problème d'index mais si c'est un soft, tout fait... Il vaudrait peut-être mieux revoir la configuration du serveur.

  8. #8
    Candidat au Club
    Inscrit en
    Mai 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    BOnjour et merci pour tout.

    Etant en plein inventaire j'ai fait un tri et supprimé des produits... et le message d'erreur a disparu.

    C'est en effet je pense (et car les oscommercants disent que online est pourri pour oscommerce sur bien des plans) un problème de serveur. Et évidemment je ne peux pas mettre les max join size plus hautes.

    Merci en tous les cas, j'avais déjà prévu de changer d'hébergeur de toutes les manières et ce problème me conforte, car c'est "abhérant" de voir qu'on atteint une certaine limite alors que je n'ai pas une multinationale et pas 10 millions de produits.

    J'espère qu'en tous les cas mon tout petit problème a pu vous "aider" dans votre domaine !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/08/2011, 10h38
  2. Comment détecter une erreur dans un process
    Par chuckboy dans le forum MFC
    Réponses: 3
    Dernier message: 25/10/2005, 10h40
  3. Réponses: 18
    Dernier message: 19/10/2005, 14h07
  4. Comment lancer une erreur dans une procédure stockée
    Par borgfabr dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/05/2005, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo