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 :

Optimisation d'une requête d'insertion


Sujet :

Oracle

  1. #1
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut Optimisation d'une requête d'insertion
    Système : Oracle 8.1.7 sur windows xp

    Machine : Pentium 4 3.40 Ghz avec un disque dur de 160 Go

    Contexte : Après le test d'une application sur un jeu d'essai d'enregistrements assez réduit (50k lignes), je suis passé à un test avec un nombre d'enregistrements plus conséquent ( 1M de lignes).

    Problème :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE1 (Champ1....Champ17) SELECT Champ1...Champ17 FROM TABLE2;
    résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    948404 ligne(s) créée(s).
     
    Ecoulé : 00 :05 :302.95
    Est-ce normal que la requête d'insertion mette 5 minutes alors qu'il n'y a aucun index sur les 2 tables et aucune jointure pour seulement 1M de lignes ?
    Que faut-il changer pour améliorer la performance de la requête ? Quand j'ai regardé la consommation du cpu, je ne suis qu'à 10% d'utilisation comment passer à 100% de consommation ?

    Merci d'avance de vos réponses.

  2. #2
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Tu commit tout les combien ?
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  3. #3
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Je lance l'instruction commit à la fin de l'insertion.

  4. #4
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    aaaaaaarrrrgg
    pas bon ca (enfin ca dépend) sous quelle DB ?
    essaye un commit à 10000
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  5. #5
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Comment tu spécifies en sql de faire un commit tous les 10 000 ?

    pas bon ca (enfin ca dépend) sous quelle DB ?
    Système : Oracle 8.1.7 sur windows xp

  6. #6
    Membre expérimenté
    Avatar de zekey
    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 036
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 036
    Points : 1 403
    Points
    1 403
    Par défaut
    Tu spécifie pas tu fais un curseur et tu loop dedans
    ou alors tu un insert avec rownum.
    Steve Hostettler
    est ton ami(e) et le tag aussi.

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 120
    Points : 69
    Points
    69
    Par défaut
    Ce qui ralentit ta requete c'est le suivi de la transaction ... Si tu fais un commit ou un rollback par la suite ...
    Si dans tous les cas tu ne fais qu'un commit et que tu ne risque pas de plantages tu peux préciser NOLOGGING en fin de ton ordre : aucun suivi ne sera effectué. Ce n'est pas le plus beau mais surement le plus efficace.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TABLE1 (Champ1....Champ17) SELECT Champ1...Champ17 FROM TABLE2 NOLOGGING;

  8. #8
    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
    Je ne pense pas que le commit intermédiaire change quoi que ce soit. Le Commit en lui-même n'est pas long par rapport au Rollback.

    Le Commit intermédiare sert surtout à ne pas exploser le rollback segment.
    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

  9. #9
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Tu peux essayer de passer la table finale en nologging :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table TABLE1 nologging;
     
    INSERT /*+ append */ INTO TABLE1 (Champ1....Champ17) SELECT Champ1...Champ17 FROM TABLE2;
    Ca générera nettement moins de redo, mais ca peut faire hérisser ton DBA... a voir car la modif ne sera pas réflétée dans les redo et ca peut poser des problemes dans le cas de backup à chaud ou de standby databases.


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  10. #10
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    Citation Envoyé par lalystar
    Tu peux essayer de passer la table finale en nologging :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table TABLE1 nologging;
     
    INSERT /*+ append */ INTO TABLE1 (Champ1....Champ17) SELECT Champ1...Champ17 FROM TABLE2;
    Ca générera nettement moins de redo, mais ca peut faire hérisser ton DBA... a voir car la modif ne sera pas réflétée dans les redo et ca peut poser des problemes dans le cas de backup à chaud ou de standby databases.


    Laly.
    Cela peux faire hérisser les DBAs mais pas les DBAtes!
    Mais bases de prod sont en FORCE LOGGING. Alors, mes developpeurs, ils font ce qu'ils veulent!


    Sinon, plus sérieusement, ama le problème ne vient pas du cpu. Peux être les I/O?

    Peux tu faire un tkprof de ta requête pour que l'on voie ou est le problème?

  11. #11
    Rédacteur

    Inscrit en
    Septembre 2004
    Messages
    626
    Détails du profil
    Informations forums :
    Inscription : Septembre 2004
    Messages : 626
    Points : 848
    Points
    848
    Par défaut
    Question bete : y a t il des triggers sur la table dans lequel on insère ?


    Laly.
    In the heart of the truly greats, perfection is never achieved but endlessly pursued.

    Mon article sur les fonctions analytiques d'Oracle (calcul de moyennes mobiles, de quartiles et bien d'autres...)

  12. #12
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    En effet, j'ai un trigger sur la table d'insertion qui permet de gérer une séquence à chaque nouvelle ligne insérée. Tu penses que la lenteur vient du trigger ? Existe-t-il une méthode plus rapide que la gestion d'une séquence dans un trigger pour un numéro auto ?

    Merci d'avance de vos réponses.

  13. #13
    Membre averti
    Inscrit en
    Novembre 2002
    Messages
    549
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 549
    Points : 436
    Points
    436
    Par défaut
    Citation Envoyé par fdraven
    En effet, j'ai un trigger sur la table d'insertion qui permet de gérer une séquence à chaque nouvelle ligne insérée. Tu penses que la lenteur vient du trigger ? Existe-t-il une méthode plus rapide que la gestion d'une séquence dans un trigger pour un numéro auto ?

    Merci d'avance de vos réponses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO ma_table(col1, col2, ...) VALUES (ma_seq.nextval,....);
    quel est l'intéret du trigger ?
    PpPool

  14. #14
    Membre confirmé

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    487
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 487
    Points : 455
    Points
    455
    Par défaut
    oui,

    tu peux faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO TABLE1 (MA_SEQUENCE, Champ1....Champ17) SELECT Ma_SEQUENCE.NEXTVAL,Champ1...Champ17 FROM TABLE2;
    Cela améliore les perfs mais ,d'expérience, c'est négligeable.

  15. #15
    Membre expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Points : 3 199
    Points
    3 199
    Par défaut
    Citation Envoyé par PpPool
    Citation Envoyé par fdraven
    En effet, j'ai un trigger sur la table d'insertion qui permet de gérer une séquence à chaque nouvelle ligne insérée. Tu penses que la lenteur vient du trigger ? Existe-t-il une méthode plus rapide que la gestion d'une séquence dans un trigger pour un numéro auto ?

    Merci d'avance de vos réponses.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    INSERT INTO ma_table(col1, col2, ...) VALUES (ma_seq.nextval,....);
    quel est l'intéret du trigger ?
    L'intérêt est d'être sûr que la séquence soit appellé, et ce, quelque soit la façon dont sont réalisées les insertions !!!

  16. #16
    Membre averti

    Profil pro
    Inscrit en
    Mai 2004
    Messages
    236
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 236
    Points : 310
    Points
    310
    Par défaut
    Grâce à vos conseils, je viens de diviser le temps par 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    948404 ligne(s) créée(s).
     
    Ecoulé : 00 :02 :35.21
    Si j'ai bien compris comment fonctionner les séquences, est-ce que ça ne serait pas plus rapide de gérer le numéro auto avec une variable directement en pl/sql pour éviter le temps d'accès et de mise à jour d'une séquence à chaque enregistrement ?

    Merci d'avance de vos réponses.

Discussions similaires

  1. Optimisation d'une requête de recherche
    Par Bobtop dans le forum Requêtes
    Réponses: 16
    Dernier message: 14/06/2006, 16h27
  2. Optimisation d'une requête
    Par Louis-Guillaume Morand dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 20/12/2005, 18h21
  3. Optimisation d'une requête patchwork
    Par ARRG dans le forum Langage SQL
    Réponses: 1
    Dernier message: 11/09/2005, 15h23
  4. optimisation d'une requête avec jointure
    Par champijulie dans le forum PostgreSQL
    Réponses: 8
    Dernier message: 07/07/2005, 09h45
  5. [DB2] Optimisation d'une requête
    Par ahoyeau dans le forum DB2
    Réponses: 7
    Dernier message: 11/03/2005, 17h54

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