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 :

Transaction sans journalisation ?


Sujet :

Oracle

  1. #1
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut Transaction sans journalisation ?
    Je fais un alter table add column.... sur une table qui contient
    beaucoup d'occurence.

    Il me plante sur la taille des fichiers Undo...

    Je cherche donc un moyen de ne pas journaliser (Ni undo, Ni redo si possible) cet ordre... j'ai cherché pas un alter session ou alter system... mais je trouve pas...

    Quelqu'un peut-il m'aider ?

    MERCI

  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 : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    add column consomme du UNDO ?

    bizarre

    Pour répondre à la question, il est absolument impossible de s'affranchir de l'utilisation du UNDO lors d'une modification des données. Quand au REDO, la clause NOLOGGING doit être paramétrée sur la table

  3. #3
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par orafrance
    add column consomme du UNDO ?

    bizarre

    Pour répondre à la question, il est absolument impossible de s'affranchir de l'utilisation du UNDO lors d'une modification des données. Quand au REDO, la clause NOLOGGING doit être paramétrée sur la table
    Précision : le add column consomme de l'UNDO parce qu'il y a une valeur par défaut sur la colonne ajoutée....

    Quelqu'un a une idée pour m'éviter de modifier la taille des fichiers d'UNDO ?
    MERCI

  4. #4
    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
    je répéte : il n'y en a pas

    Je te conseille donc d'ajouter la colonne sans valeur par défaut et de faire un update de celle-ci avec des commit intermédiaires

  5. #5
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par orafrance
    je répéte : il n'y en a pas

    Je te conseille donc d'ajouter la colonne sans valeur par défaut et de faire un update de celle-ci avec des commit intermédiaires
    En lisant les docs, je vosi aussi la possibilité de créer un rollback Segment temporaire, de spécifier que la transaction l'utilise, et de le dropper après.

    Qu'en penses-tu ?

  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
    Oui c'est une possibilité mais dans ce cas, autant agrandir le UNDO

    Je trouve surtout que tu te compliques énormément la tâche pour une simple colonne à ajouter... m'enfin, c'est toi qui voit

  7. #7
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par orafrance
    Oui c'est une possibilité mais dans ce cas, autant agrandir le UNDO

    Je trouve surtout que tu te compliques énormément la tâche pour une simple colonne à ajouter... m'enfin, c'est toi qui voit
    Alors, je m'explique un peu plus...

    Mes fichiers sont en Raw device et déjà en prod...!
    Ma table fait plus de 4 millions de lignes... et j'ai juste un champ à ajouter avec 0 en valeur par défaut...!!
    Alors, j'vois pas trop comment faire simple !!!

  8. #8
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par orafrance
    add column consomme du UNDO ?

    bizarre

    Pour répondre à la question, il est absolument impossible de s'affranchir de l'utilisation du UNDO lors d'une modification des données. Quand au REDO, la clause NOLOGGING doit être paramétrée sur la table
    ou dans l'orde SQL :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    alter table ma_table add  ( d varchar2(10)) nologging ;

  9. #9
    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
    1°) add column

    2°)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR i IN 1000..400000 LOOP
    UPDATE tab
    SET col = 0
    WHERE col IS NULL
    AND ROWNUM <= i;
    COMMIT;
    END LOOP;
    3°) alter table ... DEFAULT 0

    Voila qui devrait te permettre d'éviter de toucher au UNDO même s'il est clair que ça risque d'être "un peu" long

  10. #10
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par orafrance
    1°) add column

    2°)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR i IN 1000..400000 LOOP
    UPDATE tab
    SET col = 0
    WHERE col IS NULL
    AND ROWNUM <= i;
    COMMIT;
    END LOOP;
    3°) alter table ... DEFAULT 0

    Voila qui devrait te permettre d'éviter de toucher au UNDO même s'il est clair que ça risque d'être "un peu" long
    Ok, j'essaye...
    Je te tiens au courant...
    A+

  11. #11
    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

  12. #12
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    [quote="TotalMarsu"]
    Citation Envoyé par orafrance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR i IN 1000..400000 LOOP
    UPDATE tab
    SET col = 0
    WHERE col IS NULL
    AND ROWNUM <= i;
    COMMIT;
    END LOOP;
    Es tu sûr que cela n'utilise les UNDO , lors d'un update même s'il n'y avait pas de valeur auparavant

  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
    Citation Envoyé par jaouad
    Es tu sûr que cela n'utilise les UNDO , lors d'un update même s'il n'y avait pas de valeur auparavant

    bien sûr que ça utilise du UNDO mais un UNDO pour 1000 lignes est plus facile à "digérer" que pour 4000000 de lignes d'un coup

  14. #14
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jaouad
    Citation Envoyé par orafrance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR i IN 1000..400000 LOOP
    UPDATE tab
    SET col = 0
    WHERE col IS NULL
    AND ROWNUM <= i;
    COMMIT;
    END LOOP;
    Es tu sûr que cela n'utilise les UNDO , lors d'un update même s'il n'y avait pas de valeur auparavant
    ça utilise les UNDO... mais les transactions sont plus petites.
    Je pense que c'est ça le but du commit par morceau ..

  15. #15
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Citation Envoyé par orafrance
    Voila qui devrait te permettre d'éviter de toucher au UNDO même s'il est clair que ça risque d'être "un peu" long
    Ok , parce que je pensais que tu disais que ca ne touchais pas du tout au UNDO

    mais effectivement , la solution d'orafrance est une bonne solution

  16. #16
    Membre régulier
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 74
    Points
    74
    Par défaut
    J'ai un petit soucis de compréhension avec ca :

    Citation Envoyé par orafrance
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    FOR i IN 1000..400000 LOOP
    UPDATE tab
    SET col = 0
    WHERE col IS NULL
    AND ROWNUM <= i;
    COMMIT;
    END LOOP;
    Pourquoi la boucle commence-t-elle a partir de 1000 ? y'a-t-il une raison particuliere justifiant ce choix ?

  17. #17
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Je pense que cela ne doît être qu'un exemple ...

  18. #18
    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
    oui, parce qu'à la 1° boucle tu commences avec ROWNUM <= 1000... commencer à 1 n'aurait aucun sens

    En revanche je viens de m'apercevoir que ce script fait un pas de 1 au lieu d'un pas de 1000

    il faut ajouter un i := i+1000

  19. #19
    Candidat au Club
    Inscrit en
    Février 2004
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 9
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par jaouad
    Citation Envoyé par orafrance
    Voila qui devrait te permettre d'éviter de toucher au UNDO même s'il est clair que ça risque d'être "un peu" long
    Ok , parce que je pensais que tu disais que ca ne touchais pas du tout au UNDO

    mais effectivement , la solution d'orafrance est une bonne solution

    ET VOILA....LE CODE FINI
    MERCI


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     declare i NUMBER(10);
      2          max_toto NUMBER(10);
      3          j NUMBER(10);
      4  begin
      5  
      6  
      7  select count(*) 
      8  into   max_toto
      9  from   toto;
     10  
     11  j:= 1+ (max_toto / 100000);
     12  
     13  FOR i IN 1..j LOOP 
     14  UPDATE toto 
     15  SET toto_INDEX = 0
     18  WHERE ROWNUM >= 1 + (i-1) * 100000  
     19  AND   ROWNUM <= i * 100000
     20  AND   ROWNUM <= max_toto; 
     21  COMMIT; 
     22  END LOOP;   
     23  end;

    MERCI A TOUS LES DEUX

  20. #20
    Rédacteur

    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 320
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 320
    Points : 3 798
    Points
    3 798
    Par défaut
    Pas de quoi , n'oublie pas le bouton RESOLU

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. utiliser une transaction sans vérouiller les tables
    Par brruno dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 29/09/2014, 17h58
  2. Call transaction sans erreur
    Par inharo dans le forum SAP
    Réponses: 2
    Dernier message: 01/09/2014, 18h14
  3. [InnoDB] Transaction sans requete SQL
    Par sliderman dans le forum Requêtes
    Réponses: 1
    Dernier message: 08/04/2010, 12h36
  4. [EJB3 Entity] Usage de persist() en transaction ou sans ?
    Par tiamat dans le forum Java EE
    Réponses: 2
    Dernier message: 17/10/2007, 07h52
  5. Exécution d'une requête sans stocker les transactions
    Par Actarus69 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 24/03/2006, 12h45

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