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 :

Optimisation de sous-requêtes imbriquées


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut Optimisation de sous-requêtes imbriquées
    Bonsoir,
    Je vous explique succinctement mon problème :
    Ma table T se présente ainsi :

    c1 | c2 | c3 ...
    -------------------------------
    69654.4656 | A | c3(A) ...
    69654.4776 | A | c3(A) ...
    69654.4800 | A | c3(A) ...
    ...
    69654.8403 | A | c3(A) ...
    69654.9501 | A | c3(A) ...
    69655.0006 | A | c3(A) ...
    69655.1786 | A | 2*c3(A) ...
    69655.2800 | A | 2*c3(A) ...
    ...
    69656.8800 | A | n*c3(A) ...
    69656.8994 | B | c3(B) ...
    etc.


    Quelques précisions :
    - la colonne c1 est une clef primaire de type double et elle est croissante (il s'agit en fait de la valeur numérique d'une date, format Excel) ;
    - la colonne c2 donne les groupes d'enregistrements au seins desquels je veux opérer ma requête ; tous les enregistrements de même valeur de c2 sont successifs ;
    - la colonne c3 montre toujours le même type d'enchaînement : pour chaque instance de c2, c3 prend une valeur X puis au bout d'un certain nombre d'enregistrements, la valeurs 2*X, puis encore d'autres valeurs mais on ne s'y intéresse pas.

    La requête que je veux faire :
    Pour chacune des valeurs de c2, je veux toutes les lignes allant du premier enregistrement (pour cette valeur de c2) au troisième enregistrement (inclus) précédant le changement de valeur de c3.
    Par exemple, pour la valeur A de la colonne c2, cela va de la ligne 1 à la ligne en gras.
    Evidemment, le nombre d'enregistrements par valeur de c2 change.

    J'obtiens donc une requête un peu compliquée et pas du tout optimisée, je vous la livre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    select *  from T t1 
     where 
      t1.c1 between 
       (
       select min(t2.c1) from T t2 where t1.c2 = t2.c2
       ) and
       (
        select t3.c1 from T t3 where 
         t3.c2 = t1.c2 and
         t3.c3 < 
          (
          select min(t4.c1) from T t4 where 
           t4.c2 = t1.c2 and
           t4.c3 > 1.5 * 
            (
            select t5.c3 from T t5 where t5.c1 = 
             (
             select min(t6.c1) from T t6
              where t6.c2 = t1.c2
             )                        
            )    
          )      
        order by t3.c1 desc limit 2,1
      )          
    ;
    J'ai lancé cette requête sur une base relativement restreinte (environ 15 000 enregistrements), indexée mais je ne l'ai pas encore vue aboutir (ça fait quelques heures, déjà...).

    Je suis donc en plein désarroi : ma requête est-elle juste ? Et quand bien même elle le serait, comment puis-je l'optimiser ? Mes connaissances en SQL sont vraiment trop limitées pour avoir la moindre idée de comment m'y prendre.

    D'avance merci pour les conseils éclairés à venir !

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    Le problème c'est que toute ton organisation repose sur l'idée que tes lignes sont dans un certain ordre. Or, le SQL est issu des mathématiques ensemblistes, et il n'y a donc aucune notion d'ordre dans une table ("pas plus que d'ordre des billes dans un sac").

    Comme il n'y a que 15 000 lignes, à ta place je laisserais tout ça dans Excel où le pb peut être réglé en 5 minutes...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2006
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 5
    Par défaut
    Allons bon. Eh bien, je retourne à mon VB alors. Merci.

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 288
    Par défaut
    pas besoin de VB, ça se fait en formule Excel.

Discussions similaires

  1. Group by, sous requêtes imbriquées ?
    Par moloson dans le forum Langage SQL
    Réponses: 6
    Dernier message: 13/06/2014, 11h50
  2. Optimisation d'une requête imbriquée
    Par fab1987 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 17/04/2012, 11h59
  3. Réponses: 4
    Dernier message: 29/11/2007, 10h56
  4. Problème de requêtes imbriquées, possible sous Access ?
    Par PierrePM dans le forum Requêtes et SQL.
    Réponses: 17
    Dernier message: 14/11/2007, 19h45
  5. requêtes imbriquées sous Access
    Par Smix007 dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 19/06/2007, 14h37

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