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

SQL Oracle Discussion :

ALTER TABLE sur une table avec beaucoup de données


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut ALTER TABLE sur une table avec beaucoup de données
    Bonjour,

    J'ai une base de données qui est en production, je voudrais faire une mise à jour d'une table avec la commande suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TABLE TESTREQ MODIFY (
     PrimarySampleSampleType   DEFAULT 1 NOT NULL NOVALIDATE,
     PrimarySampleSubjectState DEFAULT 1 NOT NULL NOVALIDATE,
     PrimarySampleDilution     DEFAULT 0 NOT NULL NOVALIDATE,
     AnalysisMethod         DEFAULT 1 NOT NULL NOVALIDATE,
     AnalysisPriority       DEFAULT 1 NOT NULL NOVALIDATE,
     AnalysisPerformer      DEFAULT 1 NOT NULL NOVALIDATE,
     AnalysisOrganization   DEFAULT 1 NOT NULL NOVALIDATE
    )
    Comme la table TESTREQ contient beaucoup de données, l'exécution de la commande va durer plus de 8 heures.

    Mon objectif est de réduire ce temps pour ne pas trop perturber la production.

    J'ai essayé de diviser la commande comme suit:

    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TABLE TESTREQ ADD (
     PrimarySampleSampleType   NUMBER,
     PrimarySampleSubjectState NUMBER,
     PrimarySampleDilution     NUMBER,
     AnalysisMethod         NUMBER,
     AnalysisPriority       NUMBER,
     AnalysisPerformer      NUMBER,
     AnalysisOrganization   NUMBER
    );
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TABLE TESTREQ MODIFY (
     PrimarySampleSampleType   DEFAULT 1,
     PrimarySampleSubjectState DEFAULT 1,
     PrimarySampleDilution     DEFAULT 0,
     AnalysisMethod         DEFAULT 1 ,
     AnalysisPriority       DEFAULT 1,
     AnalysisPerformer      DEFAULT 1,
     AnalysisOrganization   DEFAULT 1
    )
    3)
    Une application qui va mettre les valeurs par défaut sur les enregistrement existant.

    4)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ALTER TABLE TESTREQ MODIFY (
     PrimarySampleSampleType   	NOT NULL,
     PrimarySampleSubjectState 	NOT NULL,
     PrimarySampleDilution     	NOT NULL,
     AnalysisMethod         	NOT NULL,
     AnalysisPriority       	NOT NULL,
     AnalysisPerformer      	NOT NULL,
     AnalysisOrganization   	NOT NULL
    )
    Mais ce 4° commande prendre toujours beaucoup de temps.
    Est ce qu'il y a possibilité que l'Oracle accepte de changer les contraints mais sans faire la vérification des données ?

  2. #2
    Membre Expert Avatar de fatsora
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 103
    Par défaut
    Bonjour,

    Pourquoi pas

    1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    alter table LA_TABLE add
    (
    PrimarySampleSampleType number DEFAULT 1 NOT NULL ,
    PrimarySampleSubjectState number DEFAULT 1 NOT NULL ,
    PrimarySampleDilution number DEFAULT 0 NOT NULL ,
    AnalysisMethod number DEFAULT 1 NOT NULL ,
    AnalysisPriority number DEFAULT 1 NOT NULL ,
    AnalysisPerformer number DEFAULT 1 NOT NULL ,
    AnalysisOrganization number DEFAULT 1 NOT NULL );
    et 2 Midif applicatif
    ?

  3. #3
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    alter table LA_TABLE add
    (
    PrimarySampleSampleType number DEFAULT 1 NOT NULL ,
    PrimarySampleSubjectState number DEFAULT 1 NOT NULL ,
    PrimarySampleDilution number DEFAULT 0 NOT NULL ,
    AnalysisMethod number DEFAULT 1 NOT NULL ,
    AnalysisPriority number DEFAULT 1 NOT NULL ,
    AnalysisPerformer number DEFAULT 1 NOT NULL ,
    AnalysisOrganization number DEFAULT 1 NOT NULL );

    Oui, ceci est ma solution de départ, mais cela prendre + de 8 heures d'exécution!

  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
    Essaiez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table LA_TABLE 
      add (constraint NN_PrimarySampleSampleType
      check ("PrimarySampleSampleType" IS NOT NULL) novalidate)

  5. #5
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Citation Envoyé par mnitu Voir le message
    Essaiez
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    alter table LA_TABLE 
      add (constraint NN_PrimarySampleSampleType
      check ("PrimarySampleSampleType" IS NOT NULL) novalidate)
    Surtout a eviter si tu ne veux pas creer une grande confusion. Dans ce cas, on ne pourra inserer NULL certes, mais la table ne montrera pas NOT NULL sur la colonne concernee... plutot source de confusion...
    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
    SQL> create table mytable(c1 number);
     
    Table created.
     
    SQL> desc mytable
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C1                                                 NUMBER
     
    SQL> alter table mytable add (constraint nn_mytable check (c1 is not null) novalidate);
     
    Table altered.
     
    SQL> desc mytable
     Name                                      Null?    Type
     ----------------------------------------- -------- ----------------------------
     C1                                                 NUMBER
     
    SQL> insert into mytable values (null);
    insert into mytable values (null)
    *
    ERROR at line 1:
    ORA-02290: check constraint (SYSADM.NN_MYTABLE) violated
    Nicolas.

  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
    Citation Envoyé par NGasparotto Voir le message
    Surtout a eviter si tu ne veux pas creer une grande confusion. Dans ce cas, on ne pourra inserer NULL certes, mais la table ne montrera pas NOT NULL sur la colonne concernee... plutot source de confusion...
    ...
    C'est vrai Nicolas vous avez raison. Mais l'optimiseur le saura.

  7. #7
    Membre chevronné Avatar de NGasparotto
    Inscrit en
    Janvier 2007
    Messages
    421
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 421
    Par défaut
    Malheureusement, il est tres couteux d'ajouter/supprimer une colonne, Oracle verifie tous les blocks de la table...
    8 heures n'est pas acceptable ? Apres tout, ce n'est pas une operation quotidienne.

    Une autre solution a etudier est :
    1. creer une table Table_b avec toutes les colonnes que tu veux, celles existantes dans la table de depart table_a, plus les nouvelles avec toutes les caracteristiques.
    2. insert de la table source dans la table cible avec /*+ APPEND */
    3. drop l'ancienne table table_a
    4. rename table_b en table_a

    Biensur, il te faudra penser recreer les index, pk, fk, grant...

    Nicolas.

  8. #8
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    7
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 7
    Par défaut
    Merci pour vos réponses trés démonstrative.

Discussions similaires

  1. Changer le nom d'une table sur SQL server avec une requete
    Par Oluha dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 01/02/2014, 23h35
  2. Réponses: 17
    Dernier message: 17/10/2013, 09h24
  3. Réponses: 1
    Dernier message: 19/10/2011, 12h13
  4. [AC-2003] insert des données d'une table dans une table d'une base externe
    Par marieo dans le forum VBA Access
    Réponses: 1
    Dernier message: 30/11/2009, 14h29
  5. Copier les enregistrements d'une table vers une table d'une autre DB
    Par karinette21 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 18/11/2008, 21h50

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