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 :

Améliorer les perf d'une procédure PL/SQL faisant un UPDATE


Sujet :

PL/SQL Oracle

  1. #1
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut Améliorer les perf d'une procédure PL/SQL faisant un UPDATE
    Bonjour,
    Sur une procedure PL/SQl, j'ai un petit souci de performance (ORACLE 9i).

    Voici ma requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		FOR i IN 1 .. listeParcelleRefId.count
          LOOP
    				UPDATE ASSOCIATION a1 SET PARCELLE_REF_ID = idParcelleRefNew
    WHERE a1.PARCELLE_REF_ID = listeParcelleRefId(i)
    				AND exists (SELECT null FROM PARCELLE p , DOSSIER d
    						    WHERE a1.PARCELLE_ID = p.PARCELLE_ID
    							  AND p.DOSSIER_ID  = d.DOSSIER_ID
    							  AND p.PARCELLE_PEC = 1
    							  AND d.CAMPAGNE_ID = idNewCampagne_);
    Cet update va se faire environ 200000 fois (à la louche) ce qui entraine que la sous requete de l'update est longue.
    Ce qui est embetant, c est que cette sous requete est la même quelque soit l'instant de l'update.

    J'ai essayé de récupérer tous les identifiants de la table ASSOCIATION est de les stocker dans une liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    SELECT ASSOCIATION_ID BULK COLLECT INTO listeIdsAssociation FROM ASSOCIATION a, PARCELLE p , DOSSIER d
    	    WHERE a.PARCELLE_ID = p.PARCELLE_ID
    		  AND p.DOSSIER_ID  = d.DOSSIER_ID
    		  AND p.PARCELLE_PEC = 1
    		  AND d.CAMPAGNE_ID = idNewCampagne_;
     
    FOR i IN 1 .. listeParcelleRefId.count
          LOOP	
    UPDATE ASSOCIATION SET PARCELLE_REF_ID = idParcelleRefNew
    				WHERE (listeIdsAssociation.EXISTS(ASSOCIATION_ID)) = TRUE;
    Mais cela ne marche pas, il n'aime pas listeIdsAssociation.EXISTS(ASSOCIATION_ID).

    Auriez vous une petite idée vers laquelle je pourrais m'orienter pour ne pas avoir à répéter la récupérations des lignes que je dois modifier, sachant qu'elle sera toujours la meme du début à la fin du traitement.

    Merci d'avance.

    Vincent

  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
    J'ai eu du mal à comprendre, t'as quoi dans listeParcelleRefId ?

  3. #3
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    Puisqu'il s'agit d'une collection, pourquoi n'utilisez-vous pas l'instruction FORALL ?

  4. #4
    Membre habitué Avatar de VinceTlse
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2005
    Messages : 163
    Points : 191
    Points
    191
    Par défaut
    En fait, je suis dans un traitement de synchronisation de parcelle agricole d'une année a l'autre. Chaque parcelle agricole repose sur une ou plusieurs parcelle de référence (parcelle cadastrale par exemple) qui peuvent changer d'une année a l autre. listeParcelleRefId correspond à la liste des parcelles de référence qui sont assosié à une parcelle en N-1 et qui doivent etre changé en N (j'ai beaucoup simplifié )

    Je vais regarder regarder cette instruction que je ne connaisais pas.
    Merci, je vous tiens au courant.

  5. #5
    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
    Pour moi les 2 codes sont totalement différents :
    Ou alors tu as oublié
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    a1.PARCELLE_REF_ID = listeParcelleRefId(i)
    dans le 2ème code.

Discussions similaires

  1. Récupérer les lignes d'une procédure SQL Server dans le programme VB.NET
    Par Mikelester12 dans le forum Accès aux données
    Réponses: 2
    Dernier message: 30/07/2007, 12h33
  2. Pb pour executer une procédure sous SQL PLUS
    Par rabddoul dans le forum Oracle
    Réponses: 4
    Dernier message: 21/10/2005, 16h40
  3. Réponses: 11
    Dernier message: 23/08/2005, 11h04
  4. [C#/SQL] Comment gérer les exceptions d'une Procédure stockée ?
    Par thomas_strass dans le forum Accès aux données
    Réponses: 10
    Dernier message: 06/07/2005, 11h40
  5. [Oracle] Exécuter une procédure PL/SQL en PHP?
    Par Cerberes dans le forum PHP & Base de données
    Réponses: 11
    Dernier message: 25/02/2005, 15h11

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