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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    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 : 43
    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
    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
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    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 émérite
    Avatar de rsc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2004
    Messages
    711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 74
    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
    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
    Membre averti
    Inscrit en
    Janvier 2008
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 34
    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 998
    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 998
    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 +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

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