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

Langage SQL Discussion :

Sous requête et performance. Un cas d'école ?


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    2
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Sous requête et performance. Un cas d'école ?
    Bonjour,

    J'ai un gros problème de performance avec un cas que je rencontre souvent. Peut être un cas d'école ?

    Pour être plus clair j'ai préparé un exemple :
    J'ai les chiffres des sociétés année par année.
    Je souhaite extraire le dernier chiffre d'affaires pour chaque société.
    Je fais donc une sous-requête avec un group by.
    Ca fonctionne très bien ... sauf que j'ai 100 000 lignes. Et là, ça me fait une recherche séquentiel sur 100 000 lignes. Comme je veux mettre toujours dans une jointure c'est extrèmement lourd.

    Ca doit être un problème très courant.
    Est ce que vous connaissez une solution qui soit meilleur que la mienne ?

    Merci d'avance

    CREATE TABLE societe (
    id_societe serial,
    nom varchar
    );

    CREATE TABLE chiffre_affaire (
    id_chiffre_affaire serial,
    id_societe integer,
    annee integer,
    valeur integer
    );
    CREATE INDEX index_chiffre_affaire_id_societe ON chiffre_affaire USING btree (id_societe);
    CREATE INDEX index_chiffre_affaire_annee ON chiffre_affaire USING btree (annee);


    INSERT INTO societe VALUES (1, 'dupont');
    INSERT INTO societe VALUES (2, 'durant');

    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (1, 2000, 100);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (1, 2001, 120);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (1, 2002, 130);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (1, 2003, 125);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (1, 2003, 115);

    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (2, 2002, 200);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (2, 2003, 210);
    INSERT INTO chiffre_affaire (id_societe, annee, valeur) VALUES (2, 2003, 220);

    EXPLAIN ANALYSE
    SELECT societe.id_societe, MAX(valeur) as valeur, MAX(nom) as nom
    FROM societe
    LEFT JOIN chiffre_affaire
    ON chiffre_affaire.id_societe=societe.id_societe
    AND annee = (SELECT MAX(annee) FROM chiffre_affaire as a WHERE a.id_societe=chiffre_affaire.id_societe)
    GROUP BY societe.id_societe;

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 48
    Points : 54
    Points
    54
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(annee) FROM chiffre_affaire as a WHERE a.id_societe=chiffre_affaire.id_societe
    Ta sous requête est bizarre, j'ai l'impression qu'elle fait référence à ta requête de base. Ce qui est impossible en SQL. Sinon, le SQL deviendrait vite incompréhensible et les résultats données serait très variables suivant le SGBD.
    Je crois que tu veux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT societe.id_societe, MAX(valeur) as valeur, MAX(nom) as nom
    FROM societe
    LEFT JOIN (SELECT MAX(annee) As Annee,Id_societe FROM chiffre_affaire group by id_societe) A ON (A.id_societe=societe.id_societe)
    LEFT JOIN chiffre_affaire
    ON chiffre_affaire.id_societe=societe.id_societe
    AND annee = A.Annee
    GROUP BY societe.id_societe;
    A+

Discussions similaires

  1. [MySQL-5.5] Performance sur l'union de sous-requêtes
    Par flashguitou dans le forum Requêtes
    Réponses: 9
    Dernier message: 30/06/2013, 20h39
  2. Problème performance sous requête MySQL
    Par Razielwar dans le forum Requêtes
    Réponses: 17
    Dernier message: 23/02/2012, 12h11
  3. cas d'école : Requête combinée avec test sur une colonne
    Par teuzadur dans le forum Requêtes et SQL.
    Réponses: 12
    Dernier message: 23/06/2011, 14h14
  4. [Toutes versions] Requête Sélection regroupement cas d'école
    Par teuzadur dans le forum Requêtes et SQL.
    Réponses: 10
    Dernier message: 15/06/2011, 15h05
  5. Performance - Sous requête ou jointure
    Par Shivan dans le forum Langage SQL
    Réponses: 5
    Dernier message: 18/12/2008, 16h06

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