Bonjour,

Je cherche à optimiser une requête SQL.

Voici ma requete de départ:

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
SELECT t0.matricule matriculecpt, t2.nombreretours
      FROM (SELECT matricule, ID
              FROM meterinfo) t0,
           (SELECT backflowcount, ID
              FROM metermodule) mm,
           (SELECT measurepointinfo, meterinfo, metermodule
              FROM pointdemesure
             WHERE fin IS NULL) t1,
           (SELECT   SUM (data_value) nombreretours, ID
                FROM instantdecimalserie_data
               WHERE (data_datetime >= '01/10/08') AND (data_datetime < '15/10/08')
            GROUP BY ID) t2
     WHERE (t0.ID = t1.meterinfo)
       AND (mm.backflowcount = t2.ID)
       AND (t2.nombreretours > 0)
       AND (mm.ID = t1.metermodule)
c'est le SUM qui semble poser problème, car la table 'instantdecimalserie_data' est très grande 1 milliards de lignes environ.

Ma solution

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
    SELECT t0.matricule matriculecpt, t2.nombreretours
    FROM (SELECT matricule, ID
    FROM meterinfo) t0,
    (SELECT backflowcount, ID
    FROM metermodule) mm,
    (SELECT meterinfo, metermodule
    FROM pointdemesure
    WHERE fin IS NULL) t1,
    (SELECT  SUM (data_value) nombreretours, ID
    FROM instantdecimalserie_data
    INNER JOIN (SELECT backflowcount
    FROM metermodule) mm
    ON mm.backflowcount = ID
    WHERE (data_datetime >= '01/10/08') AND (data_datetime < '15/10/08')
    GROUP BY ID) t2
    WHERE (t0.ID = t1.meterinfo)
    AND (mm.backflowcount = t2.ID)
    AND (t2.nombreretours > 0)
    AND (mm.ID = t1.metermodule)
un gain d'environ 30%.
Qui dis mieux?