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 :

Delete de masse


Sujet :

Oracle

  1. #1
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut Delete de masse
    Bonjour à tous,

    Je suis dans un code JAVA et j'effectue des suppressions qui peuvent être dans certains cas, massives, c'est-à-dire environ 500 000 enregistrements.

    De plus pour connaître les éléments à supprimer je fais une liaison de toutes les clés primaire dans une table temporaire.

    Ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DELETE FROM 
    (SELECT A.SOURCE FROM ARTICLE A, TMP_BATCH_EXTRACTION B 
    WHERE A.SOURCE=B.ID)
    ou
    DELETE FROM ARTICLE 
    WHERE ID IN (SELECT ID FROM TMP_BATCH_EXTRACTION)
    Le problème arrive lorsqu'il y a plus de 200 000 enregistrements çà devient extrèmement long (~10mn).
    J'ai essayé de découper les requêtes de suppression en faisant ROWNUM < 100 000 mais cela n'a pas l'air de changer grand chose (j'ai cru).

    Alors avez-vous une idée pour pouvoir supprimer des enregistrements en masse ?

    En vous remerciant d'avance.

    Cordialement
    Boutss

  2. #2
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597

  3. #3
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Je l'avais déjà lu, merci.
    Mais je ne souhaiterai pas modifier la structure des tables. Du moins, le moins possible, car j'arrive sur le projet et je ne connais pas toutes les contraintes.

    Je me demandais s'il y avait un moyen de réduire les coûts surtout qu'au départ çà semble ne pas être gourmand un delete ?? à cause des rollbacks segments ?

  4. #4
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Oui tu as bien saisi le problème, c'est malheureux mais un delete est plus long qu'un insert, c'est d'ailleurs le gros défaut du système des rollback-segments. Il faut comprendre que Oracle copie les anciens blocs dans ses segments de rollback avant de les modifier les blocs principaux. Lors d'un insert, il n'y a rien dans les anciens blocs, donc rien à sauvegarder (je résume un peu...) alors que dans un delete, il y a des beaucoup de données à copier. Un delete est donc beaucoup plus couteux...

  5. #5
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Merci Remi de confirmer !!

    Y'a-t'il un moyen de désactiver l'utilisation de ces rollbacks segments ? qui empècherai forcément le rollback.

    Et est-ce que cela servirait à quelque chose ?

    Merci

    Ps: à savoir que je commande depuis du code JAVA donc désactivation depuis les API java si possible en Oracle.

  6. #6
    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
    vous ne voulez pas modifier la base mais vous voulez modifier le fonctionnement d'Oracle ???

    non, vraiment, je crois que vous ne cherchez pas dans la bonne direction...

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    J'ai dit souhaité ... çà veut dire que si c'est la seule solution viable et pas considéré comme une magouille, je la prends...

    Donc si je dérive, il faut me remettre dans la bonne direction justement.

    Là où j'ai peur dans la modification de la table, c'est que quelqu'un soit au même moment en train de travailler dessus ou que je n'ai pas les droits, voire qu'on m'interdise de toucher à la structure de la base via des instructions JAVA.

    Alors, la solution préconisée est-elle la seule viable ?

  8. #8
    Membre éprouvé
    Inscrit en
    Avril 2006
    Messages
    1 024
    Détails du profil
    Informations forums :
    Inscription : Avril 2006
    Messages : 1 024
    Points : 1 294
    Points
    1 294
    Par défaut
    Tu ne peux pas avoir le beurre et l'argent du beurre...
    La copie dans les rollbacks permet justement d'avoir une continuité de service parcque pendant que le système purge les blocs de la table, les autres utilisateurs continuent à acceder aux données en étant dérouté dans ces rollbacks, ce qui maintient de leur point de vue des données parfaitement consistentes.

    Si tu veux cour-cricuiter les rollbacks, alors tu tolère que pendant un période, les données ne soient pas "propres".

    Généralement, la solution dans ces cas là est de faire des tables partitionnées, tu défini un critère de partitionnement (simple...) et tu peut faire un truncate d'une partition à n'importe quel moment. Mais evidement, ça fait pas dans la finesse, c'est gros paquet par gros paquet....

  9. #9
    Membre éclairé

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 414
    Points : 671
    Points
    671
    Par défaut
    juste pour information, quel impératif fonctionnel fait qu'on a besoin de faire des delete de 500000 lignes en une fois !

    Ca ressemblerait plus à un traitement batch non?

  10. #10
    Membre habitué Avatar de petit arbre
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    143
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 143
    Points : 153
    Points
    153
    Par défaut
    salut,
    t'as qu'à faire ça par petits paquets de 10000 ... avec une boucle

    c'est ce que j'ai fait sur des inserts massifs (> 1000 000)

    enfin de toute façon, à ce niveau de volume, ça prend du temps !!!

  11. #11
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    t'as qu'à faire ça par petits paquets de 10000 ... avec une boucle
    Si on fait des INSERT en masse d'accord mais si on fait des DELETE ou des UPDATE en masse et s'il y a des transactions concurrentes qui accèdent aux mêmes données en lecture, il y a un risque d'avoir ORA-1555 si on fait fait des COMMITs par paquets.

  12. #12
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    Merci à tous déjà pour vos réponse.

    @gregory.broissard : Oui c'est bien un traitement batch !

    En fait je suis en train de mettre un mécanisme d'extraction / injection en place. Il sera donc utilisé pour la Purge / Archivage / Transfert de paramétrage.

  13. #13
    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
    si tu peux trouver un critère simple de DELETE tu peux partitionner ta table. Pour purger il suffira de droper la partition

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    C'est quoi le nombre de lignes total de la table ? sa finalité ? (impact du nologging)

    Idée 1 ) Dans de nombreux cas, il est plus rapide de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    create table toto nologging
    as select * from ma_table where type_ligne='A SUPPRIMER';
    drop table ma_table;
    rename toto to ma_table;
    create index...
    Bien sur que dans un batch, sans transaction concurrente. Il n'y a pas de régle sur le ratio, mais avec un nombre d'index raisonable, on peut dire 30% de suppression.

    Le create table as select fait des ajouts en direct path (au dessus de la high water mark) donc très rapide. Si en plus on ne génére pas de redolog...

    Si tu supprimes sur une table compressée, c'est quasi obligatoire. Quand tu modifie un bloc (update ou delete) sur une table compressée, Oracle décompresse le bloc en question... Tu as donc une volumétrie qui augmente.

    idée 2 ) tu supprime tes index puis tu delete et enfin tu les recrée
    Si tu as des bitmap index, c'est quasi obligatoire

  15. #15
    Membre habitué
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2002
    Messages
    237
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Meurthe et Moselle (Lorraine)

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

    Informations forums :
    Inscription : Août 2002
    Messages : 237
    Points : 185
    Points
    185
    Par défaut
    En fait le nombre de ligne n'est pas défini car on peut paramétrer la table que l'on souhaite manipuler.

    Tu voulais marquer plutôt ceci ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    type_ligne='A CONSERVER';

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Oui, c'était bien sur "à conserver"...

    Mais avant tout, essaye le truc de supprimer les index (ou les marquer inactif) avant toute chose.

    Dans tous les cas, même avec un index tout simple, il faut en général reconstruire les index après la suppression de 200K lignes car ces derniers sont deséquilibré. (sauf si la table est vraiement énorme... j'ai un client avec une table de 2To... On s'amuse pas trop sur les index dans ces cas la).

    Autre point à prendre en compte : si tu as supprimé un gros pourcentage de lignes, le stockage de ta table est plein de "trou", ce qui fait qu'un select avant et apres le delete prendra a peu de chose prés le même temps.
    Tu as la commande alter table ma_table move (ou move compress) qui te permet de remettre les choses d'aplomb.

  17. #17
    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
    c'est pas les trous mais la HWM qui pose problème dans le cas que tu décris

  18. #18
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    La HWM oui. Problématique surtout sur les full table scan a mon avis.

    mais tant qu'on a pas fait de nouveaux inserts, je pense qu'on se retrouve dans une situation similaire à un mauvais reglage pctfree/pctused non ?
    Si j'ai 4 lignes par blocs, que je supprime 50% de lignes, je me retrouve avec une HWM qui n'a pas bougé, et j'ai maintenant 2 lignes par blocs

    Ca m'a toujours un peu g... la parti structure interne du datablock donc je dis peut etre des betises, mais je l'ai compris comme tel...

  19. #19
    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
    Mettons que tu supprimes des lignes qui ne sont quand même pas candidate au SELECT... là c'est flagrant que ça ne pose pas plus de problème non ?

    La fragmentation n'est pas une catastrophe, ce serait surtout une hérésie que de vouloir défragmenter les données à tout prix dans un OLTP

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 77
    Points : 84
    Points
    84
    Par défaut
    Défragmenter les blocs en OLTP, c'est effectivement une hérésie...

    Mais la je vois du traitement batchs (on supprime pas 200K lignes en OLTP).

Discussions similaires

  1. [2008R2] Réduction automatique du journal suite delete en masse
    Par castorameur dans le forum Administration
    Réponses: 5
    Dernier message: 21/01/2015, 13h36
  2. Delete de masse (suite)
    Par boutss dans le forum SQL
    Réponses: 34
    Dernier message: 14/12/2010, 09h14
  3. commit régulier avec un delete en masse
    Par kalyparker dans le forum Oracle
    Réponses: 18
    Dernier message: 16/01/2007, 11h17
  4. Réponses: 4
    Dernier message: 09/12/2005, 17h40
  5. Delete de masse
    Par genio dans le forum Oracle
    Réponses: 5
    Dernier message: 09/12/2005, 16h30

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