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 :

[group by] Optimiser une sous requete


Sujet :

Langage SQL

  1. #1
    Membre averti
    Avatar de if_zen
    Homme Profil pro
    Développeur Java
    Inscrit en
    Juin 2004
    Messages
    275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 275
    Points : 316
    Points
    316
    Par défaut [group by] Optimiser une sous requete
    Bonsoir,

    J'aimerais comprendre pourquoi ma requête met des plombes à s'exécuter. Je la lance sur mySQL pour info.
    La voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    select * from myTable T
    where T.id in (
    select max(t2.id) from myTable t2 group by s2.groupe
    );
    La sous requête toute seule donne un résultat quasi-instantané de 777 enregistrements.
    La requête complète, je n'ai jamais pu avoir le temps de la terminer (> 1 minute)

    Pourriez-vous m'aiguiller pour optimiser cela ? Les index sont bien créés sur ID bien sûr. groupe est un CHAR(255)

    Le but étant de récupérer l'ensemble des champs de la table T dont les ID correspondent aux plus récents par groupe.

    Merci beaucoup !

  2. #2
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    D'abbord, pardon mes erreurs. Je suis Americain et mon francais ne pas tres bien. J'apprends encore le français et j'apprécions des corrections.

    Es que vous veut dire <<GROUP BY t2.groupe>> ? Qu'est-ce que c'est s2 ?

    Essai enlèvent <<GROUP BY>>. Je ne crois pas qu'il fait n'importe quoi.

  3. #3
    rsc
    rsc est déconnecté
    Membre éprouvé
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2004
    Messages : 711
    Points : 918
    Points
    918
    Par défaut
    Première remarque : je crois que le SELECT * n'est pas super au niveau perf ; il vaut mieux nommer les colonnes.

    Deuxième remarque : le IN (un grand nombre de valeurs) n'est pas performant non plus en général. Je suppose (sans en être sûr) que c'est la même chose quand il renvoie les résultats d'une sous-requête.
    Une solution que j'envisagerais (si MySql le supporte - je connais très mal), serait de créer dans ta base une vue à partir de ta sous-requête, puis de faire dans ta requête une jointure sur cett vue :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE VIEW MAVUE (ID INTEGER)
    AS SELECT max(.id) FROM myTable GROUP BY groupe;
     
    et
     
    SELECT Colonne1,... FROM myTable
    JOIN MAVUE
    ON MAVUE.Id = MyTable.Id

  4. #4
    Nouveau membre du Club
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    Points : 30
    Points
    30
    Par défaut
    Pardon. J'ai tort. Le << GROUP BY >> doit demeurer.

    Avez-vous un index sur groupe? Un index sur t2 avec id et groupe soyez très utile. Si t2 est une grande table il peut prendre plus de 1 minute.

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 978
    Points
    52 978
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * -- remplacez le * par la liste des colonnes strictement nécessaires
    FROM   myTable
    WHERE  id IN (SELECT max(id) 
                  FROM   myTable
                  GROUP  BY groupe);
    Si vous voulez optimiser cette requête créez un index sur groupe + id, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE INDEX X ON myTable (groupe, id)
    En outre évitez l'utilisation de SELECT * si vous voulez des performances

    Pour un étude sur l'indexation et ses effets bénéfiques sur les requêtes, lisez l'article que j'ai écrit : http://www.sqlspot.com/INDEXATION-un...l-exemple.html

    A +

Discussions similaires

  1. Réponses: 15
    Dernier message: 14/04/2006, 15h34
  2. [Access] Peut-on sortir une liste d'une sous-requete?
    Par zorba49 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 17/03/2006, 10h05
  3. [MySQL] réaliser une sous requete en php
    Par SENCABOY dans le forum PHP & Base de données
    Réponses: 22
    Dernier message: 14/02/2006, 20h19
  4. Besoin d'aide pour une sous requete
    Par Celia1303 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 12/10/2005, 14h09
  5. Requete avec une sous-requete... Ne fonctionne qu'a moitie..
    Par mythtvtalk.com dans le forum MS SQL Server
    Réponses: 10
    Dernier message: 18/08/2003, 09h54

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