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

Oracle Discussion :

Problème de performance Update de 60 mille lignes.


Sujet :

Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut Problème de performance Update de 60 mille lignes.
    bonjour a tous,
    Problème: La mise à jour de 60 000 lignes met entre 3H et 4H !!!
    Objectif: Mettre à jour chaque enregistrement selon des valeurs récupéré par une requête chaque enregistrement.

    Au début j'avais crée un curseur constituant ma sélection pour effectué la MAJ de chaque enregistrement dans une boucle.
    Résultat éffectué en 3H-4H.

    Ce temp d'éxecution étant trop long (vous en conviendrez) ma permis de rechercher une autre solution et j'ai trouvé le paramètre BULK COLLECT.
    J'ai donc recommencé ma procédure stockée avec:
    - ma sélection renvoyant les différentes valeurs dans des tables (précédemment déclaré) du style:
    section DECLARE :

    * TYPE MA_TABLE IS TABLE TABLE_EXISTANTE.COLONNE%TYPE
    mytab MA_TABLE

    section BEGIN :
    * SELECT CHAMP1 BULK COLLECT INTO mytab FROM TABLE
    WHERE CRITERE...

    * FORALL i IN 1..mytab.COUNT
    UPDATE TABLEMAJ
    SET COLONNE = mytable.colonne
    WHERE CONDITION;

    COMMIT;

    Aussi, le serveur utilisé (en production) est avec la version Oracle 8i mais les résultats sont les même sur le serveur de test (Oracle 10g).

    Si vous savez d'où viens le problème !
    Parce que là je séche !!!

    merci

  2. #2
    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
    Qu'est-ce qui prend du temps : le select du curseur ou l'update derrière ?

    Il y a t-il des triggers sur la table ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Faudrait ajouter une LIMIT au BULK... il y a peut-être des contentions en mémoire.

  4. #4
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut
    Je pense que c'est l'update qui est long mais cela est de la pure supposition.

    Oui il y a une trigger sur la table lors de l'insertion, mais ma procédure stockée est executer une fois les données insérées.

    Dans mes docs oracle je n'ai bien compris l'utilisation de LIMIT.
    Peux tu m'expliquer son utilité ?

    merci d'avance

  5. #5
    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
    Cela permet de procéder par "tranches" ou "paquets" afin de ne pas exploser le rollback segment, par example.
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    il permet de définir la taille des lots pour faire un traitement par tranche

  7. #7
    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
    autrement, c'est quoi la condition de l'update ?
    Sinon, une technique est de ramener le ROWID dans la table PL/SQL et de l'utiliser dans le FORALL
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  8. #8
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut
    Ok je vais testé le paramètre LIMIT !

  9. #9
    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
    Citation Envoyé par ludvax
    Ok je vais testé le paramètre LIMIT !
    Je ne pense pas que ça réduira pas le temps de traitement
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  10. #10
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut
    Visiblement !

    C'est toujours aussi lent !

    Quoi faire ?

  11. #11
    j6m
    j6m est déconnecté
    Membre régulier
    Inscrit en
    Février 2006
    Messages
    87
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 87
    Points : 84
    Points
    84
    Par défaut à quoi sert le serveur de test
    tu testes en 10 G pour passer en prod en 8i? tu as raison de ne pas en dire plus il te faut de quoi tester et vérifier sur au moins le m^me OS et le m^me Oracle.
    quand la pierre tombe sur l’œuf, malheur à l’œuf
    quand l’œuf tombe sur la pierre, malheur à l’œuf

  12. #12
    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
    ENcore une fois, quelle est la condition de la clause WHERE de l'update ?
    est-elle optimisée ? que donne le plan d'exécution sur une seule ligne ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  13. #13
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut
    la condition de la clause WHERE de l'update est de type entier "IDSEL" (passé en paramètre) et un identifiant "MCU" récupéré par le curseur (ou dans le cas du BULK COLLECT d'un SELECT... cf:plus haut) donc différent pour chaque personne.

    Bref, dans ma selection avec en paramètre "IDSEL", je récupère une liste de personne dont je dois mettre à jour un code.
    Pour ce faire j'utilise l'identifiant "MCU" en condition de mon update avec également "IDSEL".

    Ex:
    FORALL i IN tableau.first..tableau.last
    UPDATE TABLE SET COLONNE_CODE = tableau(i).CODE
    WHERE COLONNE_MCU = tableau(i).MCU
    AND COLONNE_IDSEL = IDSEL;

    COMMIT;


    Comment optimizer dans ce cas ?

    PS: Je teste d'abord sur 10g avec SQLDevelopeur "Raptor" et lorsque le temps de traitement sera acceptable je testerai sur le serveur de test en Oracle8i avant de passé cela en prod !!!

  14. #14
    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
    ces 2 colonnes sont-elle indexées ? si oui, les indexes sont-ils valides ?
    quel est le temps d'exécution d'un update passé à la main sur une seule ligne ?
    Rédacteur Oracle (Oracle ACE)
    Guide Oracle ,Guide PL/SQL, Guide Forms 9i/10g, Index de recherche
    Je ne réponds pas aux questions techniques par MP
    Blogs: Forms-PL/SQL-J2EE - Forms Java Beans

  15. #15
    Membre émérite Avatar de Drizzt [Drone38]
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Mai 2004
    Messages
    1 001
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur de projet

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 001
    Points : 2 453
    Points
    2 453
    Par défaut
    Tu es sur que le trigger sur ta table n'est pas activé à chaque update?
    J'ai eu un problème de perf il y a peu du meme genre avec une requete qui mettait 6H pour à peu pret le meme nombre d'update et c'était l'activation des triggers qui bouffait la majorité du temps. Meme si les triggers ne faisaient rien.
    Maintenant la requete met 2-3min ... (avec accessoirement un index mieux defini qui à divise le temps par deux)

    Sinon effectivement regarde si tes 2 colonnes sont bien indexées, et si l'index est bien utilisé lorsque tu fais un update. (sous TOAD par ex, regarde l'explain plan et tu devrais voir apparaitre ton index, si il y a un full table access c'est pas bon).
    Je ne réponds pas aux questions techniques par MP, le forum est là pour cela.

    La crypto c'est comme les flambys, une fois que tu as trouvé la languette tu as juste à tirer pour tout faire tomber.

    (\ _ /)
    (='.'=)
    Voici Lapinou. Aidez le à conquérir le monde
    (")-(") en le reproduisant

  16. #16
    Membre à l'essai
    Inscrit en
    Septembre 2005
    Messages
    51
    Détails du profil
    Informations forums :
    Inscription : Septembre 2005
    Messages : 51
    Points : 16
    Points
    16
    Par défaut Problème résolu
    Tout d'abord merci a vous, pour vos réponses et remarques qui m'on permis de rechercher où je n'avais pas encore cherché !

    Effectivement, j'avais pensé au index que devais être optimiser, j'ai donc crée un index sur deux champ dont la paire est unique.

    Cependant, il y avait un type d'index que je ne connaissai pas et qui fût la réponse à ma question j'ai nommé "BITMAP".

    J'ai donc crée un index de type BITMAP sur les colonnes dont la paire est unique et je suis passé d'un temp de traitement de 3H-4H à 120 secondes !!!

    C ti pa magnifique !


    Encore merci pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de performance avec mes requêtes update
    Par Battosaiii dans le forum PL/SQL
    Réponses: 19
    Dernier message: 03/08/2011, 09h38
  2. [jeu]problème de performance d'un algo
    Par le Daoud dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 30/05/2005, 16h07
  3. [C#] Probléme de performance avec IsDbNull
    Par jab dans le forum Windows Forms
    Réponses: 8
    Dernier message: 04/04/2005, 11h39
  4. [oracle 9i][Workbench]Problème de performance
    Par nuke_y dans le forum Oracle
    Réponses: 6
    Dernier message: 03/02/2005, 17h38
  5. [ POSTGRESQL ] Problème de performance
    Par Djouls64 dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/05/2003, 16h18

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