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 :

probleme de performance avec curseur


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut probleme de performance avec curseur
    Salut,

    J'ai un proc pl/sql dans laquelle j'ai un curseur qui me ramene des donnée;

    en suite dans mon code je boucle sur ce curseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR curs IN m_curseur LOOP
    à l'interieur de cette boucle je fais une requete, qui me permet de ramener
    les enfant correspondant à une clé, clé que je recupere grace au curseur , ainsi qu une autre infos, je met le tout dans un record et je fais un forall :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    FOR curs IN m_curseur LOOP
     
    select  emp,emp_code,mgr,mgr_code,curs.spec
    BULK COLLECT INTO l_list
    from employer T 
    start with ( T.emp=curs.emp and T.emp_code = curs.emp_code ) 
    connect
    by nocycle T.mgr=prior T.mgr and T.mgr_code = prior T.emp_code;
     
     
    FORALL s IN l_list.FIRST..l_list.LAST
    INSERT INTO EMP_LIVRER VALUES l_list(s);
     
    END LOOP;
    le soucis est que si mon curseur me ramene 2000 lignes,
    je vais boucler 2000 fois et je vais jouer la requete hierarchique 2000,
    donc il va s amuser a parcourir les 678000 de ma table employer 2000 fois,
    ce qui est extrement long;
    comment pourrai je faire pour optimiser tout cela ?

    merci

  2. #2
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    le BULK ne fais qu'un seul passage ... ou des passages limités avec la clause LIMIT contrairement a une boucle FOR fetch de 1 ligne , avec le BULK c'est plusieurs centaines en une seule fois dans une collecion PLSQL.

    depuis Oracle 8, on peut donc reduire le nombre de transistion entre le PLSQL et le SQL.

    En faisant set timing on ... tu peux comparer le temps avec BULK et sans BULK.

    Mais bon , le plus rapide est insert into sans passer par le PLSQL ou mieux

    insert /*+ append */ .... ou create table as select

  3. #3
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    et pourquoi pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    INSERT INTO EMP_LIVRER 
    SELECT  emp,emp_code,mgr,mgr_code,curs.spec
    FROM employer T 
    start WITH ( T.emp=curs.emp AND T.emp_code = curs.emp_code ) 
    connect
    BY nocycle T.mgr=prior T.mgr AND T.mgr_code = prior T.emp_code;
    Et il sert à quoi ton curseur ? Pourquoi tu n'inclus pas la requête du curseur dans la requête ?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    en l incluant sa ne fonctionne pas;
    si je fais une jointure entre employer et livraison,
    le requete hierarchique ne parse pas toute la table employer, elle se limite au ligne de la jointure.
    et sans curseur, je ne peux pas recuperer la spec, qui elle est presente dans la table livraison;

    orafrance, en faite, dans le start with,
    je lui passe la clé que je recupere grace au curseur pour qu il cherche les enfants de se curseur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     WITH ( T.emp=curs.emp AND T.emp_code = curs.emp_code )

  5. #5
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Est ce que tu as lance ton script plsql ?

    Combien de temps ca prends avec le BULK ?

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2004
    Messages
    532
    Détails du profil
    Informations forums :
    Inscription : Janvier 2004
    Messages : 532
    Par défaut
    quand tu dis bulk,
    tu veux dire rajouter un bulk sur le curseur


    au lieu d avoir cela

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    FOR curs IN m_curseur LOOP

    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
    OPEN m_curseur ;
            LOOP
                FETCH m_curseur BULK COLLECT INTO curs  LIMIT 100;
                    FOR i IN curs .FIRST..curs .LAST LOOP
     
     
    SELECT  emp,emp_code,mgr,mgr_code,curs.spec
    BULK COLLECT INTO l_list
    FROM employer T 
    start WITH ( T.emp=curs(i).emp AND T.emp_code = curs(i).emp_code ) 
    connect
    BY nocycle T.mgr=prior T.mgr AND T.mgr_code = prior T.emp_code;
     
     
    FORALL s IN l_list.FIRST..l_list.LAST
    INSERT INTO EMP_LIVRER VALUES l_list(s);
     
    END LOOP;
    un truc dans ce genre ?

Discussions similaires

  1. Réponses: 28
    Dernier message: 09/09/2010, 17h27
  2. Probleme d'affichage du curseur dans un chp texte avec firef
    Par dadovb dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 20/10/2005, 12h31
  3. Réponses: 14
    Dernier message: 09/08/2004, 13h42
  4. problemes de performances avec les requetes select
    Par berry dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/07/2003, 13h39
  5. problemes de performances avec les requetes select
    Par berry dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 10/07/2003, 13h39

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