Temps execution procédure stockée FB 2.1
Bonjour,
Voici le code d'une procédure stockée
Code:
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:
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