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

Requêtes MySQL Discussion :

Requete sql trop lourde


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut Requete sql trop lourde
    Bonjour,


    j'ai un gro problème avec cette requete ci dessou qui me fait planté easy php.
    mais la question aussi que je me pose et que je doit fair un affichage qui me sortira
    les origine, l'effectif et la moyenne de commande, logiquement ma requete marche mais elle est trop lourd je voulai savoir si j'ai pas moyen de l'optimisé

    car après 3 minute sa me mets: Fatal error: Maximum execution time of 300 seconds exceeded in C:\Program Files\EasyPHP 3.0\phpmyadmin\libraries\dbi\mysqli.dbi.lib.php on line 164

    voici la requete:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT IF(customers_from LIKE '1st%','1rst',customers_from) AS Origin, 
           COUNT(*) AS effectif, AVG(commandes.commandes_montant) AS Mmc 
    FROM customers 
    inner join commandes on customers.customers_id=commandes.customers_id 
    inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id  
    WHERE commandes_status='1' and relances_gratuites_inscription_date>='2009-04-11' and  relances_gratuites_inscription_date<='2009-04-28'  
    GROUP BY Origin
    Ce qui est lourd est le inner join relances_gratuites on customers.customers_id=relances_gratuites.customers_id

    Mais je suis obligé car je veu avoir les renseignements qui ce trouve entre ces deux dates.

    Es-ce qu'il y a une autre façon de faire ou y-a-t-il une solution pour allegé la requette??

  2. #2
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Tu peux déjà remplacer ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    relances_gratuites_inscription_date >=  '2009-04-11'  
    AND  relances_gratuites_inscription_date <='2009-04-28'
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    relances_gratuites_inscription_date BETWEEN '2009-04-11' AND '2009-04-28'
    mais je crains que ça ne change pas grand chose.
    Y-at'il un index sur la colonne relances_gratuites_inscription_date ?
    Ce qui doit pénaliser davantage, de mon point de vue, c'est le GROUP BY Origin qui ne peut s'appuyer sur aucun index, les jointures quant à elles s'opérant sur des id, devraient au contraire bénéficier des index.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut
    Merci Maljuna Kris


    Y-at'il un index sur la colonne relances_gratuites_inscription_date ?
    non il n'y a pas d'index sur cette colonne

    et pour le GROUP BY Origin je suis obligé car je veut l'affichage qui est par origine. Donc je doit le gardé

  4. #4
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par sinifer Voir le message
    non il n'y a pas d'index sur cette colonne
    Eh bien tu devrais en mettre un.
    Quant au GROUP BY Origin, je sais bien que tu en as besoin, (je crois même être à l'origine de cette version de la requête). Mais il n'en demeure pas moins que ça doit copieusement plomber le serveur.

    En outre j'ai un gros doute sur le COUNT(*), on est censé compter quoi, au juste, les clients ? les commandes ? les relances ?
    Parce que là on compte les lignes sans tenir compte des doublons.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    458
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 458
    Par défaut
    Effectivement j'ai enlevé le count(*)

    la requette quej'utilise actuellement est celle là
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin, 
           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
           AVG(co.commandes_montant) AS Mmc 
    FROM customers cu
    INNER JOIN commandes co 
    ON cu.customers_id=co.customers_id 
    INNER JOIN relances_gratuites rg 
    ON cu.customers_id=rg.customers_id  
    WHERE co.commandes_status='1' 
    AND relances_gratuites_inscription_date BETWEEN '2009-04-11' AND '2009-04-28'   
    GROUP BY Origin
    Sa fait 5minute que je l'ai lancé mais toujours rien a tourne

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Citation Envoyé par sinifer Voir le message
    la requette quej'utilise actuellement est celle là
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     SELECT IF(cu.customers_from LIKE '1st%','1rst',cu.customers_from) AS Origin, 
           COUNT(DISTINCT cu.customers_id) AS effectif, count(co.commandes_status) AS command,
           AVG(co.commandes_montant) AS Mmc 
    FROM customers cu
    INNER JOIN commandes co 
    ON cu.customers_id=co.customers_id 
    INNER JOIN relances_gratuites rg 
    ON cu.customers_id=rg.customers_id  
    WHERE co.commandes_status='1' 
    AND relances_gratuites_inscription_date BETWEEN '2009-04-11' AND '2009-04-28'   
    GROUP BY Origin
    On peut appliquer le même raisonnement à COUNT(co.commandes_status) et AVG(co.commandes_montant), s'il peut y avoir plusieurs relances gratuites par commande le comptage et la moyenne seront faussés, et là, pas question de s'en tirer avec un DISTINCT, pour la moyenne en tout cas.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

Discussions similaires

  1. Requete SQL trop dure pour moi - ep 2 "le retour"
    Par ExtremeI dans le forum Requêtes
    Réponses: 5
    Dernier message: 15/10/2013, 17h55
  2. [MySQL-5.5] Requete SQL trop dur pour moi ^_^
    Par ExtremeI dans le forum Requêtes
    Réponses: 2
    Dernier message: 16/08/2013, 20h38
  3. Réponses: 20
    Dernier message: 14/03/2008, 08h23
  4. requete sql trop longue enregistrement en mémoire ou sur disque
    Par jyvaut75 dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 01/02/2008, 15h11
  5. [Optimisation] Requete trop lourde avec Left outer join...
    Par batosai dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/05/2006, 13h40

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