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

Administration Oracle Discussion :

Delete et failed to extend segment


Sujet :

Administration Oracle

  1. #1
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut Delete et failed to extend segment
    Bonjour,

    Je souhaite supprimer les données d'une table, en filtrant sur la date < 60 jours. J'ai 3300 dates différentes dans la table donc bcp de données et a chaque fois que j'execute le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    delete from table where table.date < sysdate - 60
    j'ai l'erreur Failed to extend Rollback segment.

    Comment faire pour que mon delete passe ?
    Comment découper mon delete ?

    Merci de votre aide,

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    Par défaut
    tu peux commiter toutes les 500 lignes par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    LOOP
    DELETE FROM table 
    WHERE table.date < sysdate - 60 
    AND ROWNUM <= 500;
     
    EXIT WHEN SQL%ROWCOUNT=0;
     
    COMMIT;
    END LOOP;
    COMMIT;
    END;
    /

  3. #3
    Membre averti

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

    Informations forums :
    Inscription : juin 2004
    Messages : 487
    Points : 448
    Points
    448
    Par défaut
    ou encore mieux.

    Le probleme vient du fait que tu ecris tes deletes dans les rollback segments et tu dois en ecrire trop.

    donc tu cree une table avec les données que tu ne veux pas deleter, puis tu truncate ta table, puis tu importe.

    Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table ma_table_temp as
    select * FROM table 
    WHERE table.date >= sysdate - 60 
    and  ROWNUM > 500; 
     
     
    truncate table
     
    insert into table select * from ma_table_temp
    et tu as gagné du temps.
    Et tu n'as pas empeché les autres de travaillé si ta table est enorme

  4. #4
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    décembre 2002
    Messages
    3 433
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : décembre 2002
    Messages : 3 433
    Points : 7 896
    Points
    7 896
    Par défaut
    Citation Envoyé par aline
    ou encore mieux.

    Le probleme vient du fait que tu ecris tes deletes dans les rollback segments et tu dois en ecrire trop.

    donc tu cree une table avec les données que tu ne veux pas deleter, puis tu truncate ta table, puis tu importe.

    Cela donne:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    create table ma_table_temp as
    select * FROM table 
    WHERE table.date >= sysdate - 60 
    and  ROWNUM > 500; 
     
     
    truncate table
     
    insert into table select * from ma_table_temp
    et tu as gagné du temps.
    Et tu n'as pas empeché les autres de travaillé si ta table est enorme
    Malheureusement, ça a de bonnes chances d'être un remède pire que le mal, selon la proportion de données à conserver, puisque l'insertion fait aussi appel aux segments d'annulation.

    A la rigueur, il faudrait en complément utiliser le mode NOLOGGING, mais personnellement je ne suis pas très friand de son utilisation, car elle remet en cause la sécurité que constituent les fichiers de reprise (redo log files pour ceux qui ne parlent pas français).

    Alors il n'y a pas à tergiverser, il faut avoir au moins un segment d'annulation assez gros pour supporter la transaction la plus volumineuse.
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  5. #5
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    Merci de vos aides.

    Je vais opter pour la solution N°1 avec le loop, mais m'assurez vous qu'en utilisant le rownum toutes les lignes seront supprimées sans exceptions ?

    La seconde solution pourrait me poser aussi des pb de segment.

    Et effectivement, seul un segment assez gros ne me poserait pas de pb, cela étant dit, je me trouve dans un environnement de dev qui ne me le permet pas ...

  6. #6
    Membre averti

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

    Informations forums :
    Inscription : juin 2004
    Messages : 487
    Points : 448
    Points
    448
    Par défaut
    Citation Envoyé par Pomalaix
    Malheureusement, ça a de bonnes chances d'être un remède pire que le mal, selon la proportion de données à conserver, puisque l'insertion fait aussi appel aux segments d'annulation.
    .
    Bon evidement, la proportion de données à conserver entre en jeu et c'est un facteur primordial.
    Mais par contre, je ne suis pas entierement d'accord avec toi quand tu compare les insertions et les suppressions au niveaux des écritures dans les redos. Les suppressions sont le cas ou il y a le plus d'écriture et les insertions le moins.

    Mais bon, vous faites evidement ce que vous voulez, les conseilleurs ne sont pas les payeurs!

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    Par défaut
    Citation Envoyé par elitost
    Je vais opter pour la solution N°1 avec le loop, mais m'assurez vous qu'en utilisant le rownum toutes les lignes seront supprimées sans exceptions ?
    Oui puisque j'arrête les delete (je sors de la boucle) que si il n'y a plus rien à supprimer

  8. #8
    Expert Oracle confirmé

    Homme Profil pro
    Consultant Big Data
    Inscrit en
    mars 2003
    Messages
    438
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Consultant Big Data
    Secteur : Conseil

    Informations forums :
    Inscription : mars 2003
    Messages : 438
    Points : 912
    Points
    912
    Par défaut
    Citation Envoyé par Pomalaix
    Malheureusement, ça a de bonnes chances d'être un remède pire que le mal, selon la proportion de données à conserver, puisque l'insertion fait aussi appel aux segments d'annulation.
    De quelle insertion parles-tu Pomalaix ?
    Effectivement, l'insertion par un INSERT classique fait appel aux segments d'annulation, par contre l'utilisation du CTAS (Create Table As Select) qui créée la table et insère les données en une seule passe ne fait pas appel à ces segments.

    Citation Envoyé par Pomalaix
    A la rigueur, il faudrait en complément utiliser le mode NOLOGGING, mais personnellement je ne suis pas très friand de son utilisation, car elle remet en cause la sécurité que constituent les fichiers de reprise (redo log files pour ceux qui ne parlent pas français).
    Tout à fait d'accord avec toi. A moins qu'ELITOST soit sur une base de développement (ou autre) qui ne soit pas en mode ARCHIVELOG.

    Citation Envoyé par Aline
    create table ma_table_temp as
    select * FROM table
    WHERE table.date >= sysdate - 60
    and ROWNUM > 500;

    truncate table table ;

    insert into table select * from ma_table_temp ;
    A la place, on peut faire aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    create table ma_table_temp as select * FROM table 
    WHERE table.date >= sysdate - 60 
    and  ROWNUM > 500; 
     
    drop table table ;
     
    rename ma_table_temp to table ;
    Par contre, il faut penser à reconstruire les triggers, les index, les contraintes si il y en a.

  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 669
    Points
    11 669
    Par défaut
    Bref, la solution d'Orafrance est de loin la plus simple.
    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
    Expert éminent
    Avatar de elitost
    Homme Profil pro
    Consultant informatique
    Inscrit en
    septembre 2003
    Messages
    1 985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : septembre 2003
    Messages : 1 985
    Points : 6 566
    Points
    6 566
    Par défaut
    A moins qu'ELITOST soit sur une base de développement (ou autre) qui ne soit pas en mode ARCHIVELOG.
    Aucune idée.

    La solution 1 me convient bien , à ceci près sur un problème de date < année 2000 , question que j'ai posé dans un autre post de ce forum.

    Je tag résolu pr ma part.

  11. #11
    Membre averti

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

    Informations forums :
    Inscription : juin 2004
    Messages : 487
    Points : 448
    Points
    448
    Par défaut
    oui, la solution d'orafrance est la plus simple à ecrire, je n'en disconvient pas.
    Mais pas la plus rapide ni la plus impactante si il faut faire beaucoup de delete

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

    Informations forums :
    Inscription : janvier 2004
    Messages : 15 967
    Points : 19 070
    Points
    19 070
    Par défaut
    Le truncate est effectivement une bonne solution si peu de lignes sont concervées et SURTOUT si il n'y a pas de FK sur la table parce que dans ce cas, ça complique énormément la donne

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

Discussions similaires

  1. problème maven build failed : unable to delete file
    Par GandalfZeGrey dans le forum Maven
    Réponses: 2
    Dernier message: 11/01/2008, 14h42
  2. Réponses: 4
    Dernier message: 21/05/2007, 16h51
  3. Réponses: 2
    Dernier message: 23/03/2007, 11h44
  4. Segmentation fault sur new[] et delete[]
    Par Don ViP dans le forum C++
    Réponses: 4
    Dernier message: 30/04/2006, 01h29
  5. Réponses: 21
    Dernier message: 30/03/2005, 18h22

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