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

PL/SQL Oracle Discussion :

lenteur d'une boucle FOR pour cursor


Sujet :

PL/SQL Oracle

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Janvier 2006
    Messages : 102
    Points : 36
    Points
    36
    Par défaut lenteur d'une boucle FOR pour cursor
    Salut,
    j'ai un curseur et dans le traitement j'utilise ma boucle FOR pour fetcher le curseur, mais au debut etait rapide mais je ne sais ce qui est arrivé, quand le programme rentre dans la boucle FOR qui fetch le curseur reste de plus en plus de temps : au debut 1 min, aprés c'est 10 min maintenant 35 min.

    et j'ai essyé la requette parametrée sur laquelle se base le curseur, elle s'execute vite elle renvois une centaine de lignes.
    mais quand le programme en entier s'execute, dés que le programme arrive a la boule il met 30 min pour fetcher tout le curseur et j'ai meme mis en commentaire tout le traitement a l'interieur de la boucle FOR mais c'est toujours la meme lenteur.
    j'ai meme changé la boucle FOR par LOOP exit when mais donne la meme chose.

    je vous mis ici le code pour avoir une idée.

    S.V.P si avez une idée pour resoudre ce probleme je vous remercie infiniment.
    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
     
    CURSOR c_sgv_bdo(p_date_route_de   DATE,
                     p_date_route_a    DATE) IS
    SELECT *
    FROM ODSHDV_SEGMENT_VOL sgv
    where SGV.VOP_ROP_DT_DEP_PREV_Z between p_date_route_de and p_date_route_a
      AND sgv.vop_rop_trp_code=v_code_trans
      AND sgv.svl_code         != Ods_Constante_Pkg.cst_sgv_annule
      AND sgv.PROVENANCE='C6_OASIS'
      AND NOT EXISTS (SELECT 1
                        FROM WRKHDV_SSIM_FLIGHT sync
           WHERE sync.sgv_id = sgv.id AND sync.no_batch=v_no_batch);
    begin
    FOR v_sgv_bdo IN c_sgv_bdo(v_date_debut, v_date_fin)
                LOOP
                  v_log_id := NULL;
               ----------------------------------------------------------------------------
                  -- Pour chaque segment de vol de la BDO
               ----------------------------------------------------------------------------
               ----------------------------------------------------------------------------
                  -- Si le segment de vol n'existe pas dans SSIM
               -- et qu'il n'est pas annulé dans la BDO
               ----------------------------------------------------------------------------
                   v_rec_sgv_bdo.vop_rop_no_route          := v_sgv_bdo.vop_rop_no_route;
                v_rec_sgv_bdo.vop_rop_dt_dep_prev_z     := v_sgv_bdo.vop_rop_dt_dep_prev_z;
                v_rec_sgv_bdo.vop_rop_trp_code          := v_sgv_bdo.vop_rop_trp_code;
                v_rec_sgv_bdo.vop_no_vol                := v_sgv_bdo.vop_no_vol;
                v_rec_sgv_bdo.sufx_ops                  := v_sgv_bdo.sufx_ops;
                v_rec_sgv_bdo.aer_code_origine          := v_sgv_bdo.aer_code_origine;
                   v_rec_sgv_bdo.aer_code_destination      := v_sgv_bdo.aer_code_destination;
                v_rec_sgv_bdo.avn_code                  := v_sgv_bdo.avn_code;
                v_rec_sgv_bdo.tpa_code                  := v_sgv_bdo.tpa_code;
                v_rec_sgv_bdo.tvl_code                  := v_sgv_bdo.tvl_code;
                v_rec_sgv_bdo.jr_ops                    := v_sgv_bdo.jr_ops;
                   v_rec_sgv_bdo.dt_dep_planif_z           := v_sgv_bdo.dt_dep_planif_z;
                   v_rec_sgv_bdo.dh_dep_planif_z           := v_sgv_bdo.dh_dep_planif_z;
                   v_rec_sgv_bdo.dh_arr_planif_z           := v_sgv_bdo.dh_arr_planif_z;
                v_rec_sgv_bdo.dh_dep_revis_z            := v_sgv_bdo.dh_dep_revis_z;
                v_rec_sgv_bdo.dh_arr_revis_z            := v_sgv_bdo.dh_arr_revis_z;
                   v_rec_sgv_bdo.dh_dep_barr_reel_z        := v_sgv_bdo.dh_dep_barr_reel_z;
                v_rec_sgv_bdo.dh_arr_barr_reel_z        := v_sgv_bdo.dh_arr_barr_reel_z;
                   v_rec_sgv_bdo.dh_dep_piste_reel_z       := v_sgv_bdo.dh_dep_piste_reel_z;
                v_rec_sgv_bdo.dh_arr_piste_reel_z       := v_sgv_bdo.dh_arr_piste_reel_z;
                           -----------------------------------------------------------------------------------------------------------------------------------------------
                           -- Insérer la différence dans la table pour l'impression du rapport  de synchronisation des segments de vol
                           -- ON INSERE DES NULLS DANS LA APRTIE AIMS DANS LA TABLE WRKHDV_SYNCHRO CAR CES SEGEMENTS DE VOLS CODESHARE N'EXISTENT PAS DANS FICHIERS SSIM
                           ---------------------------------------------------------------------------------------------------------------------------------------------
                    inserer_wrkhdv__SSIM_hdv0130r(v_no_batch,
                                                  v_code_trans,
                                            null,
                                            v_rec_sgv_bdo,
                          2086,
                       'Trouvé dans BDO, non trouvé dans SSIM',
                           v_log_id);
                END LOOP;
    end;

  2. #2
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Si en mettant l'intérieur de la boucle c'est toujours aussi long, alors c'est la requête.

    Les moyens d'analyse :
    1/ Es-tu sur d'avoir testé la même requête (avec les mêmes paramètres, le Ods_Constante_Pkg.cst_sgv_annule)
    2/ Quand tu dis que ça te ramène une centaine de ligne, attention sous Toad, il ne ramène que les X premières, tout n'est pas fetché d'un coup.
    3/ Est ce que les stats sont à jour (j'ai vu des gros traitements qui inséraient des lignes au début, et il fallait passer une analyse pour optimiser).

    Les moyens de vérification
    1/ Mettre des traces (dbms_output) afin de voir combien de lignes sont réellement fetchées, et combien de temps ça prend.
    2/ Lancer le traitement avec des analyses (pour vérifier avec tkprof)
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

Discussions similaires

  1. Lenteur d'une boucle For each next
    Par Val2000 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 27/05/2013, 11h41
  2. Réponses: 5
    Dernier message: 05/02/2010, 19h04
  3. [hold] pour une boucle [for] de plot
    Par Newenda dans le forum MATLAB
    Réponses: 12
    Dernier message: 31/07/2009, 11h50
  4. création d'une boucle for pour interrogation requête sql
    Par philder62 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 10/12/2007, 15h14
  5. utiliser une valeur float pour une boucle for
    Par didi59650 dans le forum Débuter
    Réponses: 6
    Dernier message: 18/04/2006, 17h32

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