Bonjour,

Voici le code d'une procédure stockée
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
/*
            
                          
  Params
  ------
  <param>  : <purpose>
*/
declare variable trbn char(4);
declare variable num_trbn integer;
declare variable dt_ok timestamp;
declare variable dt_arret timestamp;
 
 
begin
    num_trbn=1;  
    /*Parcours des turbines */
    while (num_trbn<=NB_TURBINE) do
    begin
         REF_TURBINE_VALOREM='';  
          trbn='T'||cast(num_trbn as varchar(2));
          /*recupere les dernieres infos dans la table status où le numéro de groupe est différent de 25*/
          select first 1 S.REF_TURBINE_VALOREM,S.CODE_STATUS,S.NOM_STATUS,C.COULEUR_MARQUEUR from STATUS S inner join CONFIG_STATUS C
          on C.CODE_STATUS=S.CODE_STATUS and S.NOM_PROJET=:PRJT and S.REF_TURBINE_VALOREM=:trbn and C.NOM_PROJET=:PRJT
          and C.NUM_GROUPE<>'25'
          order by DEBUT_STATUS desc into :REF_TURBINE_VALOREM,:CODE_STATUS,:NOM_STATUS,:COULEUR;          
          /*récupere la couleur correspondant au code status */
          /*select COULEUR_MARQUEUR from  CONFIG_STATUS where CODE_STATUS=:CODE_STATUS and NOM_PROJET=:PRJT into :COULEUR;           */
          /*si le code status n'est pas 0 il faut rechercher le dernier arret pour voir si la machine */
          /*ne devrait tuojours pas etre dans cet état car elle n'aurait pas redémarré (status OK)                 */
          if (CODE_STATUS<>'0') then
          begin
             /*recherche du 1er arret */
             select first 1 DEBUT_STATUS from STATUS where FAMILLE_CALC_MAIN_COURANTE='ARRET'
             and NOM_PROJET=:PRJT and REF_TURBINE_VALOREM=:trbn order by DEBUT_STATUS desc into :dt_arret ;
             /*recherche du 1er OK */
             select first 1 DEBUT_STATUS from STATUS where CODE_STATUS='0'
             and NOM_PROJET=:PRJT and REF_TURBINE_VALOREM=:trbn order by DEBUT_STATUS desc into :dt_ok;
             /*si la date de l'arret et plus récente que le status OK alors on imporse la couleur orange */
             if (dt_ok<dt_arret) then
                COULEUR='ORANGE';
          end
          /*recupere les dernieres infos dans la table data 10 min                                   */
          select first 1 DATE_HEURE, PUISS_ACTIVE_PRODUITE,VITESSE_VENT_NACELLE from DATA_10MIN where NOM_PROJET=:PRJT and REF_TURBINE_VALOREM=:trbn
                 order by DATE_HEURE desc into :DT_HR,:PRODUCTION,:VIT_VENT;
           if (REF_TURBINE_VALOREM='') then
              REF_TURBINE_VALOREM=trbn;      
           suspend;         
 
    num_trbn=num_trbn+1;                 
 
    end/*fin du parcours des turbines */
end
On voit que la pluspart des requetes demandent un classement par date desc
Ce que je ne comprends pas c'est que quelque soit ma facon de créer l'index (ASC ou DESC)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CREATE DESC INDEX I_STATUS_DEBUT_STATUS ON STATUS (DEBUT_STATUS);
ma procédure prend le meme temps (environ 8sec)
Or si j'execute les requetes une à une je vais quasiment 10 fois plus vite !!

Il y a sans aucun doute quelque chose que je dois mal faire mais où??

Merci