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] massif sans generer de redolog


Sujet :

Administration Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Par défaut [DELETE] massif sans generer de redolog
    Bonjour, j'ai le probleme suivant:

    Je dois effacer plus de 300.000 enregistrements dans une table et ca va generer trop de redo logs ( pas assez d'espace disponible ). Alors vous me direz pas grave tu te mets en NO LOGGING et ca passe.

    Oui mais voila le probleme si je ne me trompe pas, les redologs passent dans le processe d'archivage et ces archivelog sont envoyees sur la standby qui ne va pas pouvoir recuperer les modifications.

    Je me trompe ? avez vous une technique de sioux a me donner ? :p

    je suis a cours d'idees

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    217
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 217
    Par défaut
    Bonjour,
    Peut être créer une table as select (de structure identique, de nom différent) qui contiendrait les enregistrements à garder.
    Puis drop ancienne table et renommage de la nouvelle.

    Frédéric.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 146
    Par défaut
    L'idee n'est pas mauvaise mais la table a 36 milions de lignes donc le create table as select va etre assez ... consequent niveau espace disque.

    Par rapport a notre contract nous n'avons pas le droit de modifier la structure car ca sera une belle breche dans laquelle ils vont s'enfiler si ca ne fonctionne plus.

    J'ai envoye un ticket au support je vais vous tenir au courant.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2008
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2008
    Messages : 62
    Par défaut dump
    Si on reprend son idée de créer une autre table et de supprimer celle qui existe actuellement sauf que cette fois-ci tu fais un dump de ta table à archiver où tu veux , disque cassette ou autres et tu supprimes celle que as actuellement.

  5. #5
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    Citation Envoyé par fred_04510 Voir le message
    Bonjour,
    Peut être créer une table as select (de structure identique, de nom différent) qui contiendrait les enregistrements à garder.
    Puis drop ancienne table et renommage de la nouvelle.

    Frédéric.
    cela n'est possible que si aucune contrainte référençant cette table n'existent...
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  6. #6
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,
    Citation Envoyé par Vincent Rogier Voir le message
    cela n'est possible que si aucune contrainte référençant cette table n'existent...
    Dans ce cas, il est possible de désactiver ces contraines puis de les réactiver NOVALIDATE RELY vu qu'on est sur de ne pas avoir perdu de données en route.
    Cordialement,
    Franck.

  7. #7
    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
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    cela n'est possible que si aucune contrainte référençant cette table n'existent...
    De toute façon si la table concernée est une table parent référencée par une contrainte d'intégrité référentielle, on ne peut y supprimer des lignes que si ces lignes ne sont pas référencées dans une table enfant.

    On peut faire cette opération DELETE avec un CTAS en supprimant la contrainte sur la table enfant avant renommage de la nouvelle table parent et en recréant la contrainte sur la table enfant pour référencer la nouvelle table. Exemple avec Oracle XE:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    SQL> create table p(px int primary key, py int check (py > 0), pz varchar2(10) n
    ot null);
     
    Table created.
     
    SQL> create table e(ex int primary key);
     
    Table created.
     
    SQL> alter table e add constraint efk foreign key(ex) references p;
     
    Table altered.
     
    SQL>
    SQL> insert into p values(1,1,'un');
     
    1 row created.
     
    SQL> insert into p values(2,2,'deux');
     
    1 row created.
     
    SQL>
    SQL> insert into e values(2);
     
    1 row created.
     
    SQL>
    SQL> commit;
     
    Commit complete.
     
    SQL>
    SQL> create table pp as select * from p where px >=2;
     
    Table created.
     
    SQL> alter table e drop constraint efk;
     
    Table altered.
     
    SQL> drop table p;
     
    Table dropped.
     
    SQL> alter table pp rename to p;
     
    Table altered.
     
    SQL> alter table p add primary key(px);
     
    Table altered.
     
    SQL> alter table e add constraint efk foreign key(ex) references p;
     
    Table altered.
     
    SQL>
    SQL> set long 500
    SQL> set pagesize 99
    SQL> select dbms_metadata.get_ddl('TABLE', 'P', user) as ddl from dual;
     
    DDL
    --------------------------------------------------------------------------------
     
     
      CREATE TABLE "HR"."P"
       (    "PX" NUMBER(*,0),
            "PY" NUMBER(*,0),
            "PZ" VARCHAR2(10) NOT NULL ENABLE,
             PRIMARY KEY ("PX")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "USERS"  ENABLE
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147
     
     
    SQL>
    SQL>
    Il ne faut pas oublier de recréer les contraintes différentes de NOT NULL ainsi que les GRANT et les index.

  8. #8
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Par défaut
    je ne parlais pas du delete mais du drop.

    ta table a purger peut tres bien avoir une PK et d'autres tables des FK avec un cascade delete sur cette PK.

    Le delete marche bien sur mais le drop, dans la proposition effectuée, est impossible car des FK référencent la table.
    C'est l'objet de ma remarque.

    Citation Envoyé par pifor Voir le message
    De toute façon si la table concernée est une table parent référencée par une contrainte d'intégrité référentielle, on ne peut y supprimer des lignes que si ces lignes ne sont pas référencées dans une table enfant.

    On peut faire cette opération DELETE avec un CTAS en supprimant la contrainte sur la table enfant avant renommage de la nouvelle table parent et en recréant la contrainte sur la table enfant pour référencer la nouvelle table. Exemple avec Oracle XE:

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    SQL> create table p(px int primary key, py int check (py > 0), pz varchar2(10) n
    ot null);
     
    Table created.
     
    SQL> create table e(ex int primary key);
     
    Table created.
     
    SQL> alter table e add constraint efk foreign key(ex) references p;
     
    Table altered.
     
    SQL>
    SQL> insert into p values(1,1,'un');
     
    1 row created.
     
    SQL> insert into p values(2,2,'deux');
     
    1 row created.
     
    SQL>
    SQL> insert into e values(2);
     
    1 row created.
     
    SQL>
    SQL> commit;
     
    Commit complete.
     
    SQL>
    SQL> create table pp as select * from p where px >=2;
     
    Table created.
     
    SQL> alter table e drop constraint efk;
     
    Table altered.
     
    SQL> drop table p;
     
    Table dropped.
     
    SQL> alter table pp rename to p;
     
    Table altered.
     
    SQL> alter table p add primary key(px);
     
    Table altered.
     
    SQL> alter table e add constraint efk foreign key(ex) references p;
     
    Table altered.
     
    SQL>
    SQL> set long 500
    SQL> set pagesize 99
    SQL> select dbms_metadata.get_ddl('TABLE', 'P', user) as ddl from dual;
     
    DDL
    --------------------------------------------------------------------------------
     
     
      CREATE TABLE "HR"."P"
       (    "PX" NUMBER(*,0),
            "PY" NUMBER(*,0),
            "PZ" VARCHAR2(10) NOT NULL ENABLE,
             PRIMARY KEY ("PX")
      USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
      PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
      TABLESPACE "USERS"  ENABLE
       ) PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING
      STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147
     
     
    SQL>
    SQL>
    Il ne faut pas oublier de recréer les contraintes différentes de NOT NULL ainsi que les GRANT et les index.
    Vincent Rogier.

    Rubrique ORACLE : Accueil - Forum - Tutoriels - FAQ - Livres - Blog

    Vous voulez contribuer à la rubrique Oracle ? Contactez la rubrique !

    OCILIB (C Driver for Oracle)

    Librairie C Open Source multi-plateformes pour accéder et manipuler des bases de données Oracle

  9. #9
    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
    Par défaut
    Citation Envoyé par Vincent Rogier Voir le message
    je ne parlais pas du delete mais du drop.

    ta table a purger peut tres bien avoir une PK et d'autres tables des FK avec un cascade delete sur cette PK.

    Le delete marche bien sur mais le drop, dans la proposition effectuée, est impossible car des FK référencent la table.
    C'est l'objet de ma remarque.
    OK mais dans mon exemple je supprime bien cette FK et je la recrée sur la nouvelle table. Ceci doit fonctionner si la table enfant n'est pas en cours d'utilisation.

  10. #10
    Expert confirmé
    Avatar de pachot
    Homme Profil pro
    Developer Advocate YugabyteDB
    Inscrit en
    Novembre 2007
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : Suisse

    Informations professionnelles :
    Activité : Developer Advocate YugabyteDB
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 1 822
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Citation Envoyé par AlternantOracle Voir le message
    Je dois effacer plus de 300.000 enregistrements dans une table
    ... dans une table de combien d'enrgistrements en tout ?

    Parce que l'import du dump va générer lui du redo log pour les enregistrements à garder.

    Et la taille des enregistrements va jouer aussi.Parce que le redo d'un delete, c'est la taille du ROWID seulement, alors que le redo d'un insert, c'est toutes els colonnes de l'enregistrement.

    Donc si c'est 300.000 enregistrements parmi 600.000 ce n'est pas sûr que tu génères moins de log.

    Pour le 'create as select', c'est un peu mieux. il est en mode direct, donc il ne génère pas d'undo (qui lui aussi est source de redo).

    Cordialement,
    Franck

Discussions similaires

  1. [Checkstyle] [Maven] Generer le checkstyle sans generation de site
    Par bassemeco dans le forum Qualimétrie
    Réponses: 0
    Dernier message: 25/04/2008, 14h34
  2. operator new sans delete
    Par babar63 dans le forum C++
    Réponses: 21
    Dernier message: 26/02/2008, 22h33
  3. Delete massif avec commit intermédiaire
    Par cooclub dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 08/08/2006, 14h01
  4. Réponses: 5
    Dernier message: 10/05/2006, 09h10
  5. [version 8.1] problème de delete massif
    Par XPierrot dans le forum DB2
    Réponses: 6
    Dernier message: 12/01/2006, 16h01

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