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 :

Insertion (ou delete) en masse


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 107
    Par défaut Insertion (ou delete) en masse
    Bonjour à tous !

    J'ai une petite question, j'ai une requete du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
        BEGIN
            INSERT INTO NAME_RANKING (NAME_ID, RANKING_ID)
            SELECT NAME_ID, ranking_id FROM PRODUCT_NAMES WHERE NAME = class_string;
        END;
    Cette requête insère des milliers de lignes (voir des millions) , mais forcément, il y a des soucis de performance (idem pour les delete).

    Comment puis-je améliorer au mieux cette requête ? Utiliser "FORALL" ou une boucle "FOR" et faire un "COMMIT" tous les n passage ...?

    Je suis un peu perdu dans tout ca (car avant de poster j'ai quand meme regardé ce qu'il se faisait

    Merci

  2. #2
    Membre très actif Avatar de star
    Homme Profil pro
    .
    Inscrit en
    Février 2004
    Messages
    940
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Corée Du Nord

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Février 2004
    Messages : 940
    Par défaut
    si tu as des indexes sur cette table supprime les avant de lancer l'opération ensuite recrée les
    Pour une suppression totale des lignes d'une table le mieux est d'utiliser truncate
    .

  3. #3
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 107
    Par défaut
    Merci @Star pour ta réponse.

    En fait, il s'agit d'une procédure lancé via Java. Je sais pas s'il on peut (et si s'est conseillé) supprimer les index dans une procédure pour les "reconstruire" ensuite.

    Pour les deletes, ils ne concernent pas toutes la table, seulement une partie genre entre 100 000 ligne et 1 million .

  4. #4
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    La façon de faire est normalement optimale. Utiliser bulk insert ne devrait pas changer grand chose mais j'ai récemment survolé un article de Jonathan Lewis qui montre qu'en 11g dans certaines conditions le bulk se comporte mieux.
    Ensuite, ce type de traitement peut s'accélérer en faisant un direct path insert via le hint APPEND. Mais cette méthode pose certaines restrictions comme l'absence des clés étrangères et triggers et a des implications qui faut bien évaluer.
    Autre piste consiste dans le chargement en parallèle mais la machine doit avoir de ressources disponible pour y bénéficier sinon l'effet peut être contraire.
    Concernant la suppression des masse il y un poste assez connue sur le site de Tom Kyte qui explique que si la proportion des enregistrements supprimes est importante il est mieux de créer une nouvelle table juste avec les enregistrements à garder, détruire l'ancienne table et renommer la nouvelle.
    Et comme d'habitude quand vous avez un problème de performance il faut analyser le traitement dans son ensemble et trouver où le temps passe. C'est à partir de la que vous savez précisément sur quoi il faut agir.

  5. #5
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Mars 2010
    Messages
    107
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 107
    Par défaut
    Merci @mnitu

    Pour la suppression, ca peut etre une bonne idée, je vais essayer.

    Et concernant l'utilisation du "forall" est-ce bien ? et faire des commit par paquets, est-ce que ca serait plus rapide ?

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    "ForAll" est synonyme de ce que j'ai appelé "bulk insert".
    Commit par paquets non.

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

Discussions similaires

  1. numéro oracle prédéfinie pour insert et delete?
    Par hoaxpunk dans le forum Oracle
    Réponses: 4
    Dernier message: 26/04/2006, 16h24
  2. Réponses: 4
    Dernier message: 09/12/2005, 17h40
  3. Delete de masse
    Par genio dans le forum Oracle
    Réponses: 5
    Dernier message: 09/12/2005, 16h30
  4. Réponses: 4
    Dernier message: 05/04/2005, 18h28
  5. Redirect de la page après un insert/update/delete
    Par mchicoix dans le forum XMLRAD
    Réponses: 5
    Dernier message: 25/02/2005, 09h31

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