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 requete avec 6 calculs de rank


Sujet :

Requêtes MySQL

  1. #1
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut Optimisation requete avec 6 calculs de rank
    Bonjour,

    J'ai une table avec des résultats, l'idée est d'afficher le rang des coureurs, j'utilise donc la notion des rank + order by.

    Sauf que çà rame :/

    J'ai les indexes suivants



    ALTER TABLE MANU_results ADD INDEX (course_fk) ;

    ALTER TABLE MANU_results ADD INDEX course_fk_nat (course_fk, temps_natation );

    ALTER TABLE MANU_results ADD INDEX course_fk_velo (course_fk, temps_velo );

    ALTER TABLE MANU_results ADD INDEX course_fk_cap (course_fk, temps_cap );

    Merci les amis

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    SELECT id                                                                                            AS id, (select count(*) 
      from MANU_results 
      where state=1 
      and course_fk = (select course_fk 
      from MANU_results 
      where id = 2602)) as nb_coureurs,       classement_general                                                                            AS rg,        chrono_final                                                                                  AS tps,        dossard                                                                                       AS dossard,        nom                                                                                           AS nom,        club                                                                                          AS club,        categorie                                                                                     AS cat,        rang_dans_la_categorie                                                                        AS rg_cat,        user_id                                                                                       AS user_id,        temps_natation                                                                                AS nat,        rang_natation                                                                                 AS rg_nat,        temps_t1                                                                                      AS t1,        rang_t1                                                                                       AS rg_t1,        Addtime(temps_natation, temps_t1)                                                             AS tps_t1,        rang_issuet1                                                                                  AS cl_t1,        rang_issuet1 - rang_natation                                                                  AS gain_t1,        temps_velo                                                                                    AS velo,        rang_velo                                                                                     AS rg_velo,        Addtime(Addtime(temps_natation, temps_t1), temps_velo)                                        AS tps_velo,        rang_issuevelo                                                                                AS cl_velo,        rang_issuevelo - rang_issuet1                                                                 AS gain_velo,        temps_t2                                                                                      AS t2,        rang_t2                                                                                       AS rg_t2,        Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t1)                     AS tps_t2,        rang_issuet2                                                                                  AS cl_t2,        rang_issuet2 - rang_issuevelo                                                                 AS gain_t2,        temps_cap                                                                                     AS cap,        rang_cap                                                                                      AS rg_cap,        Addtime(Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t1), temps_cap) AS tps_cap,        rang_issuecap                                                                                 AS cl_cap,        rang_issuecap - rang_issuet2                                                                  AS gain_cap 
      FROM   (SELECT a.id,                a.classement_general,                a.chrono_final,                a.dossard,                a.nom,                a.club,                a.categorie,                a.rang_dans_la_categorie,                a.user_id,                a.temps_natation,                rank_natation.rang_natation,                a.temps_t1,                rank_t1.rang_t1,                rank_issuet1.rang_issuet1,                a.temps_velo,                rank_velo.rang_velo,                rank_issuevelo.rang_issuevelo,                a.temps_t2,                rank_t2.rang_t2,                rank_issuet2.rang_issuet2,                a.temps_cap,                rank_cap.rang_cap,                rank_issuecap.rang_issuecap         
      FROM   MANU_results a                
      LEFT JOIN (SELECT p.dossard,                                  @curranknat := @curranknat + 1 AS rang_natation                           
      FROM   MANU_results p,                                  (SELECT @curranknat := 0) r1                           
      WHERE  p.course_fk = (SELECT course_fk                                                 
      FROM   MANU_results                                                 
      WHERE  id = 2602)                                  
      AND p.temps_natation != '00:00:00'                           
      ORDER  BY temps_natation, p.dossard) AS rank_natation                       
      ON rank_natation.dossard = a.dossard                
      LEFT JOIN (SELECT p1.dossard,                                  @currankt1 := @currankt1 + 1 AS rang_t1                           
      FROM   MANU_results p1,                                  (SELECT @currankt1 := 0) r1                           
      WHERE  p1.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p1.temps_t1 != '00:00:00'                           
      ORDER  BY temps_t1, p1.dossard) AS rank_t1                       
      ON rank_t1.dossard = a.dossard                
      LEFT JOIN (SELECT p5.dossard,                                  @currankissuet1 := @currankissuet1 + 1 AS                                  rang_issuet1                           
      FROM   MANU_results p5,                                  (SELECT @currankissuet1 := 0) r1                           
      WHERE  p5.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p5.temps_natation != '00:00:00'                           
      ORDER  BY Addtime(temps_natation, temps_t1), p5.dossard) AS rank_issuet1                       
      ON rank_issuet1.dossard = a.dossard                
      LEFT JOIN (SELECT p2.dossard,                                  @currankvelo := @currankvelo + 1 AS rang_velo                           
      FROM   MANU_results p2,                                  (SELECT @currankvelo := 0) r1                           
      WHERE  p2.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p2.temps_velo != '00:00:00'                           
      ORDER  BY p2.temps_velo, p2.dossard) AS rank_velo                       
      ON rank_velo.dossard = a.dossard                
      LEFT JOIN (SELECT p6.dossard,                                  @currankissuevelo := @currankissuevelo + 1 AS                                  rang_issuevelo                           
      FROM   MANU_results p6,                                  (SELECT @currankissuevelo := 0) r1                           
      WHERE  p6.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p6.temps_velo != '00:00:00'                                  
      AND p6.temps_natation != '00:00:00'                           
      ORDER  BY Addtime(Addtime(temps_natation, temps_t1), temps_velo),                                     p6.dossard) AS rank_issuevelo                       
      ON rank_issuevelo.dossard = a.dossard                
      LEFT JOIN (SELECT p3.dossard,                                  @currankt2 := @currankt2 + 1 AS rang_t2                           
      FROM   MANU_results p3,                                  (SELECT @currankt2 := 0) r1                           
      WHERE  p3.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p3.temps_t2 != '00:00:00'                           
      ORDER  BY p3.temps_t2, p3.dossard) AS rank_t2                       
      ON rank_t2.dossard = a.dossard                
      LEFT JOIN (SELECT p7.dossard,                                  @currankissuet2 := @currankissuet2 + 1 AS                                  rang_issuet2                           
      FROM   MANU_results p7,                                  (SELECT @currankissuet2 := 0) r1                           
      WHERE  p7.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p7.temps_velo != '00:00:00'                                  
      AND p7.temps_natation != '00:00:00'                           
      ORDER  BY Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t2),                                     p7.dossard) AS rank_issuet2                       
      ON rank_issuet2.dossard = a.dossard                
      LEFT JOIN (SELECT p4.dossard,                                  @currankcap := @currankcap + 1 AS rang_cap                           
      FROM   MANU_results p4,                                  (SELECT @currankcap := 0) r1                           
      WHERE  p4.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p4.temps_cap != '00:00:00'                           
      ORDER  BY temps_cap, p4.dossard) AS rank_cap                       
      ON rank_cap.dossard = a.dossard                
      LEFT JOIN (SELECT p8.dossard,                                  @currankissuecap := @currankissuecap + 1 AS                                  rang_issuecap                           
      FROM   MANU_results p8,                                  (SELECT @currankissuecap := 0) r1                           
      WHERE  p8.course_fk = (SELECT course_fk                                                  
      FROM   MANU_results                                                  
      WHERE  id = 2602)                                  
      AND p8.temps_velo != '00:00:00'                                  
      AND p8.temps_natation != '00:00:00'                                  
      AND p8.temps_cap != '00:00:00'                           
      ORDER  BY Addtime(Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo ), temps_t2), temps_cap),                                     p8.dossard) AS rank_issuecap                       
      ON rank_issuecap.dossard = a.dossard         
      WHERE  a.course_fk = (SELECT course_fk                               
      FROM   MANU_results                               
      WHERE  id = 2602)                
      AND a.state = 1) detail 
      where detail.id = 2602
    Emmanuel Lecoester
    => joomla addict.

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Emmanuel Lecoester .

    Si vous aviez commencé par faitr l'effort de la mise en forme de votre gigantesque requête, vous auriez remarqué ce qui ne va pas !
    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    SELECT  id AS id,
           (select  count(*)
              from  MANU_results
             where  state=1 
               and  course_fk = (select  course_fk
                                   from  MANU_results
                                  where  id = 2602
                                )
           )                                                                                               AS nb_coureurs,
            classement_general                                                                             AS rg,
            chrono_final                                                                                   AS tps,
            dossard                                                                                        AS dossard,
            nom                                                                                            AS nom,
            club                                                                                           AS club,
            categorie                                                                                      AS cat,
            rang_dans_la_categorie                                                                         AS rg_cat,
            user_id                                                                                        AS user_id,
            temps_natation                                                                                 AS nat,
            rang_natation                                                                                  AS rg_nat,
            temps_t1                                                                                       AS t1,
            rang_t1                                                                                        AS rg_t1,
            Addtime(temps_natation, temps_t1)                                                              AS tps_t1,
            rang_issuet1                                                                                   AS cl_t1,
            rang_issuet1 - rang_natation                                                                   AS gain_t1,
            temps_velo                                                                                     AS velo,
            rang_velo                                                                                      AS rg_velo,
            Addtime(Addtime(temps_natation, temps_t1), temps_velo)                                         AS tps_velo,
            rang_issuevelo                                                                                 AS cl_velo,
            rang_issuevelo - rang_issuet1                                                                  AS gain_velo,
            temps_t2                                                                                       AS t2,
            rang_t2                                                                                        AS rg_t2,
            Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t1)                      AS tps_t2,
            rang_issuet2                                                                                   AS cl_t2,
            rang_issuet2 - rang_issuevelo                                                                  AS gain_t2,
            temps_cap                                                                                      AS cap,
            rang_cap                                                                                       AS rg_cap,
            Addtime(Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t1), temps_cap)  AS tps_cap,
            rang_issuecap                                                                                  AS cl_cap,
            rang_issuecap - rang_issuet2                                                                   AS gain_cap
     
      FROM  (SELECT  a.id,
                     a.classement_general,
                     a.chrono_final,
                     a.dossard,
                     a.nom,
                     a.club,
                     a.categorie,
                     a.rang_dans_la_categorie,
                     a.user_id,
                     a.temps_natation,
                     rank_natation.rang_natation,
                     a.temps_t1,
                     rank_t1.rang_t1,
                     rank_issuet1.rang_issuet1,
                     a.temps_velo,
                     rank_velo.rang_velo,
                     rank_issuevelo.rang_issuevelo,
                     a.temps_t2,
                     rank_t2.rang_t2,
                     rank_issuet2.rang_issuet2,
                     a.temps_cap,
                     rank_cap.rang_cap,
                     rank_issuecap.rang_issuecap
               FROM  MANU_results  AS a
     
          LEFT JOIN (SELECT  p.dossard,
                             @curranknat := @curranknat + 1  AS rang_natation
                       FROM  MANU_results p,
                            (SELECT  @curranknat := 0) AS r1
                      WHERE  p.course_fk = (SELECT  course_fk
                                              FROM  MANU_results
                                             WHERE  id = 2602
                                           )
                        AND  p.temps_natation != '00:00:00'
                   ORDER BY  temps_natation, p.dossard
                    ) AS rank_natation
                 ON  rank_natation.dossard = a.dossard
     
          LEFT JOIN (SELECT  p1.dossard,
                             @currankt1 := @currankt1 + 1 AS rang_t1
                       FROM  MANU_results p1,
                            (SELECT  @currankt1 := 0)  AS r1
                              WHERE  p1.course_fk = (SELECT  course_fk
                                                       FROM  MANU_results
                                                      WHERE  id = 2602
                                                    )
                                AND  p1.temps_t1 != '00:00:00'
                           ORDER BY  temps_t1, p1.dossard
                    ) AS rank_t1
                 ON  rank_t1.dossard = a.dossard
     
          LEFT JOIN (SELECT  p5.dossard,
                             @currankissuet1 := @currankissuet1 + 1  AS rang_issuet1
                       FROM   MANU_results p5,
                             (SELECT  @currankissuet1 := 0)  AS r1
                      WHERE  p5.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p5.temps_natation != '00:00:00'
                   ORDER BY  Addtime(temps_natation, temps_t1), p5.dossard)  AS rank_issuet1
                         ON  rank_issuet1.dossard = a.dossard
     
          LEFT JOIN (SELECT  p2.dossard,
                             @currankvelo := @currankvelo + 1  AS rang_velo
                       FROM  MANU_results p2,
                            (SELECT @currankvelo := 0)  AS r1
                      WHERE  p2.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p2.temps_velo != '00:00:00'
                   ORDER BY  p2.temps_velo, p2.dossard
                    ) AS rank_velo
                 ON  rank_velo.dossard = a.dossard
     
          LEFT JOIN (SELECT  p6.dossard,
                             @currankissuevelo := @currankissuevelo + 1  AS rang_issuevelo
                       FROM  MANU_results p6,
                            (SELECT  @currankissuevelo := 0)  AS r1
                      WHERE  p6.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p6.temps_velo     != '00:00:00'
                        AND  p6.temps_natation != '00:00:00'
                   ORDER BY  Addtime(Addtime(temps_natation, temps_t1), temps_velo), p6.dossard
                    )  AS rank_issuevelo                       
                 ON  rank_issuevelo.dossard = a.dossard
     
          LEFT JOIN (SELECT  p3.dossard,
                             @currankt2 := @currankt2 + 1  AS rang_t2
                       FROM  MANU_results p3,
                            (SELECT @currankt2 := 0) AS r1
                      WHERE  p3.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p3.temps_t2 != '00:00:00'
                   ORDER BY  p3.temps_t2, p3.dossard
                    )  AS rank_t2
                 ON  rank_t2.dossard = a.dossard
     
          LEFT JOIN (SELECT  p7.dossard,
                             @currankissuet2 := @currankissuet2 + 1  AS rang_issuet2
                       FROM  MANU_results p7,
                            (SELECT  @currankissuet2 := 0) AS r1
                      WHERE  p7.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p7.temps_velo     != '00:00:00'
                        AND  p7.temps_natation != '00:00:00'
                   ORDER BY  Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo), temps_t2), p7.dossard
                    )  AS rank_issuet2
                 ON  rank_issuet2.dossard = a.dossard
     
          LEFT JOIN (SELECT  p4.dossard,
                             @currankcap := @currankcap + 1  AS rang_cap
                       FROM  MANU_results p4,
                            (SELECT  @currankcap := 0)  AS r1
                      WHERE  p4.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p4.temps_cap != '00:00:00'
                   ORDER BY  temps_cap, p4.dossard
                    )  AS rank_cap
                 ON  rank_cap.dossard = a.dossard
     
          LEFT JOIN (SELECT  p8.dossard,
                             @currankissuecap := @currankissuecap + 1  AS rang_issuecap
                       FROM  MANU_results p8,
                            (SELECT @currankissuecap := 0)  AS r1
                      WHERE  p8.course_fk = (SELECT  course_fk
                                               FROM  MANU_results
                                              WHERE  id = 2602
                                            )
                        AND  p8.temps_velo     != '00:00:00'
                        AND  p8.temps_natation != '00:00:00'
                        AND  p8.temps_cap      != '00:00:00'
                   ORDER BY  Addtime(Addtime(Addtime(Addtime(temps_natation, temps_t1), temps_velo ), temps_t2), temps_cap), p8.dossard
                    )  AS rank_issuecap
                 ON  rank_issuecap.dossard = a.dossard
     
              WHERE  a.course_fk = (SELECT  course_fk
                                      FROM  MANU_results
                                     WHERE  id = 2602
                                   )
                AND  a.state = 1
            )  AS detail
     
     where  detail.id = 2602;
    Il y a des répétitions qui n'ont pas lieu d'être.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Re-salut Emmanuel Lecoester.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT  course_fk
      FROM  MANU_results
     WHERE  id = 2602
    1) Ceci est une répétition qui n'a pas lieu d'être ! Pourquoi ?
    Votre façon d'accéder à la base de données est mal organisée.

    2) je constate que c'est toujours la même table "MANU_results" qui est utilisé pour vos extractions.
    N'auriez-vous pas un problème de modélisation ?

    Autrement dit, il est fort probable que vous stockez des colonnes qui pourraient être externalisées dans une autre table.

    3) pourquoi ne pas utiliser les vues (VIEW) afin d'alléger votre requête qui est hyper lourde ?

    4) depuis la version MySql 7.0, il est déconseillé de mettre pour les dates et les heures, des expressions à zéro.
    Il vaut mieux utiliser le marqueur NULL.

    5) vous avez des jointures qui sont construites toujours de la même façon. Je prends une de vos jointures en exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LEFT JOIN (SELECT  p.dossard,
                       @curranknat := @curranknat + 1  AS rang_natation
                 FROM  MANU_results p,
                      (SELECT  @curranknat := 0) AS r1
                WHERE  p.course_fk = (SELECT  course_fk
                                        FROM  MANU_results
                                       WHERE  id = 2602
                                     )
                  AND  p.temps_natation != '00:00:00'
             ORDER BY  temps_natation, p.dossard
              ) AS rank_natation
           ON  rank_natation.dossard = a.dossard
    Nous retrouvons au plus interne ce que j'ai déjà signalé au §1 (le select avec id = 2602).
    Vous devez l'externaliser de votre sous requête afin d'éviter des répétitions inutiles.
    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
    SELECT  course_fk
      FROM  MANU_results  as z
     
    LEFT JOIN (SELECT  p.dossard,
                       p.course_fk
                       @curranknat := @curranknat + 1  AS rang_natation
                 FROM  MANU_results  AS p,
                      (SELECT  @curranknat := 0) AS r1
                WHERE  p.temps_natation != '00:00:00'
             ORDER BY  temps_natation, p.dossard
              ) AS rank_natation
           ON  rank_natation.dossard    = a.dossard
          AND  rank_natation.course_fk  = z.course_fk
     
     WHERE  id = 2602
    6) vous devez créer des index uniquement sur les jointures et les wheres.
    Dans l'exemple précédent, un index sur (course_fk ; dossard).

    Je ne suis pas certain de l'utilité de vos index à vous.

    7) je voie un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE  p.temps_natation != '00:00:00'
    dans votre sous-requête. Pouvez-vous traduire ce que cela signifie dans une course donnée ?

    J'interprète que vous avez un coureur qui n'a pas participé à la course.

    8) n'ayant pas le descriptif de votre table, ni un jeu d'essai représentatif de votre problème, il est difficile de poursuivre l'analyse.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  4. #4
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Pas de souci Merci de t'être penché sur mon sujet.

    Donc la table results contient : les resultats d'une course avec les différents temps Natation / T1 / velo / T2 / course à pied. J'ai donc 5 temps dans la table. Pas d'utilité à mon sens d'externaliser dans une table avec le type de temps, le temps + autoincrement. et je respecte les règles de forme normale vu que le temps natation ne dépend pas des autres.

    le point d'entrée de la requete c'est l'id du resultat : id technique technique (auto increment).

    Maintenant il faut donc les rank pour une course donc à partir de l'id tech on retrouve la course d'où :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     p.course_fk = (SELECT  course_fk
                                        FROM  MANU_results
                                       WHERE  id = 2602
                                     )
    si on ne filtre pas la course ben les rank sont pas bon.

    si un coureur n'a pas couru une course => temps à 00:00 (j'avoue le nul aurait été plus cool). donc je filtre les rank avec <> 00:00 sinon çà va les fausser. Donc potentiellement moins de ligne d'où les LEFT OUTER JOIN

    Pour les VIEW, c'est par réfexe et pas sur qu'elles optimisent la requete.

    Très bonne journée,

    Emmanuel
    Emmanuel Lecoester
    => joomla addict.

  5. #5
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Pour analyser un problème de performances, le DDL complet des tables et index et les volumes respectifs de chacune des tables serait très utile...

    Citation Envoyé par Emmanuel Lecoester Voir le message
    Donc la table results contient : les resultats d'une course avec les différents temps Natation / T1 / velo / T2 / course à pied. J'ai donc 5 temps dans la table. Pas d'utilité à mon sens d'externaliser dans une table avec le type de temps, le temps + autoincrement. et je respecte les règles de forme normale vu que le temps natation ne dépend pas des autres.
    Juste pour ma culture personnelle, que sont T1 et T2 ?
    Sinon, vous omettez le fait qu'un concurrent peut tout à fait ne participer qu'à une partie seulement des épreuves (ex : abandon) du coup, vous aurez n colonnes nulles ...
    La bonne modélisation est donc d'associer les épreuves (natation, vélo, course à pied et peut être T1 et T2 ...) à une compétition.
    Le concurrent qui participe à une épreuve doit être inscrit à la compétition (contrainte d'intégrité fonctionnelle)
    Chaque concurrent obtient ou pas un rang dans chaque épreuve
    - Ca vous permettra d'utiliser votre modèle pour tous types de compétition (avec 1, 2, 10 ...n épreuves ça fonctionnera aussi)
    - Ca vous permettra également d'affecter des coefficients différents à chaque épreuve

    De plus, avec votre modèle actuel, vous avez été contraints de créer un index pour chaque colonne résultat soit 5 index en plus de la PK et des autres index éventuels.
    La conséquence est que vous pénalisez les insert/delete et update !

  6. #6
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    en plus de ce qui a été dit, j'ajouterai que le premier index est inutile car redondant avec chacun des trois autres.

    à mon avis, vous pouvez le supprimer

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Voici un MCD qui fait l'affaire :

    Pièce jointe 297978

    L'épreuve est identifiée relativement à la compétition (les parenthèses des cardinalités)
    il est donc facile de mettre en œuvre la contrainte d'intégrité fonctionnelle de type inclusion (le I cerclé), pour vérifier que tout concurrent qui obtient un classement dans une épreuve, est bien inscrit dans la compétition. (Contrainte de type "reference" dans le DDL)
    J'ai ajouté une date dans la relation "Classer_CL" pour le cas où tous les concurrents d'une épreuve ne passent pas l'épreuve le même jour, il me semble que c'est le cas dans certaines compétitions

    Et le MLD correspondant :
    Pièce jointe 297979

  8. #8
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    Je vais te dire OK et merci pour cette propo mais au final tu fais comment pour récupérer en UNE requete les différents temps et rang de chaque épreuve ainsi que les temps cumulé.

    D'un point de vue puriste oui vous avez raison, d'un point de vue requete je ne suis pas sur que ce modèle 3NF soit mieux que ce que j'ai proposé initialement.

    En attendant je calcul les rang au chargement du fichier contenu les résultats. Mysql va très vite et tout va pour le mieux.

    Emmanuel
    Emmanuel Lecoester
    => joomla addict.

  9. #9
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 555
    Points
    38 555
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par Emmanuel Lecoester Voir le message
    Bonjour,

    J'ai une table avec des résultats, l'idée est d'afficher le rang des coureurs, j'utilise donc la notion des rank + order by.
    Sauf que çà rame :/
    Citation Envoyé par Emmanuel Lecoester Voir le message
    Mysql va très vite et tout va pour le mieux.


    Du coup ... où est la question ?

    note : c'est sans doute parceque je n'ai pas compris ce que vous voulez dire par :
    Citation Envoyé par Emmanuel Lecoester Voir le message
    En attendant je calcul les rang au chargement du fichier contenu les résultats.
    Et :
    - Pourquoi proposer une requete qui ne correspond pas au modèle physique de données (bien sur dépendant du modèle conceptuel)
    - toutes choses égales par ailleurs, une BDD issue d'un MCD qui respecte les formes normales sera toujours plus performante qu'une BDD qui ne les respecte pas
    - les requêtes sont plus simples sur une BDD qui respecte les formes normales

  10. #10
    Membre expert
    Avatar de Emmanuel Lecoester
    Profil pro
    Inscrit en
    Février 2003
    Messages
    1 493
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Février 2003
    Messages : 1 493
    Points : 3 266
    Points
    3 266
    Par défaut
    le calcul des 6 rangs en left outer join rame
    le calcul des rangs un par un au moment de charger les données ne rame pas

    Pour la notion de qui est le plus rapide, j'avais déjà ce type d'échange il y a plus de 15 ans ici même... J'étais un ayatollah des 3NF et 3NF-BC avec mon ami SQL-Pro, j'étais responsable DVP de la rubrique SGBD (d'où mon nom complet comme identifiant).

    J'ai grandi depuis et je peux t'assurer que les modèles dé-normalisés qu'on trouve bien souvent dans les entreprises sont plus performants que des modèles 3NF. Je ne suis pas là pour lancer un échange qui n'aboutira pas. J'ai trouvé une solution, certaine pas 3NF mais une solution qui fonctionne. Merci de t'être penché sur le sujet.

    Emmanuel
    Emmanuel Lecoester
    => joomla addict.

  11. #11
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    Citation Envoyé par escartefigue
    une BDD issue d'un MCD qui respecte les formes normales sera toujours plus performante qu'une BDD qui ne les respecte pas
    Et donc dé normaliser une base de données n'a aucune raison d'être selon vous ?

    Citation Envoyé par escartefigue
    - les requêtes sont plus simples sur une BDD qui respecte les formes normales
    Ca reste à voir.

    J'ai déjà rencontré des requêtes sur une quinzaine de tables, ce qui me semble énorme, avec des temps de réponses catastrophiques.
    Tout ça, pour respecter scrupuleusement les formes normales.

    Citation Envoyé par Emmanuel Lecoester
    je peux t'assurer que les modèles dé-normalisés qu'on trouve bien souvent dans les entreprises sont plus performants que des modèles 3NF.
    Je suis du même avis que vous.
    Mais pour dé normaliser une base, il faut aussi avant la normaliser.

    Maintenant, il n'existe pas qu'une seule solution à la performance des requêtes.
    Maîtriser la forme normale d'une base de données et ensuite les performances, je ne veux pas dire que ce sont des approches antagonistes, mais cela demande une compréhension du travail demandé qui n'est pas toujours bien assimilée par ceux qui développent.

    Citation Envoyé par Emmanuel Lecoester
    J'étais un ayatollah des 3NF et 3NF-BC
    Je n'aime pas du tout cette vision sectaire !
    Il n'existe aucune règle générale qui permet de résoudre n'importe quel problème.
    Le cas d'école est la solution qui répond à la normalisation. Mais dans la réalité, c'est bien plus compliqué que ça.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Optimisation requete avec select Imbriqué
    Par sintesi974 dans le forum Requêtes
    Réponses: 6
    Dernier message: 04/08/2010, 17h18
  2. Requete avec champs calculés qui ne marche pas
    Par The_Super_Steph dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/06/2007, 14h39
  3. [Optimisation] Requetes avec agregats et vue
    Par rad_hass dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 14/01/2006, 13h39
  4. Optimisation requete avec sous-requetes multiples
    Par gege.boubou dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/09/2005, 10h42
  5. optimisation requetes avec base de données
    Par flogreg dans le forum Décisions SGBD
    Réponses: 9
    Dernier message: 05/07/2005, 14h54

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