Lors de l'ajout d'une colonne à une table qui a une valeur par défaut et une contrainte non nulle. Est-il préférable d'exécuter une instruction unique ou de la diviser en étapes pendant que la base de données est en charge.
ALTER TABLE user ADD country VARCHAR2(4) DEFAULT 'GB' NOT NULL
VERSUS
ALTER TABLE user ADD country VARCHAR2(2)
UPDATE user SET country = 'GB'
COMMIT
ALTER TABLE user MODIFY country DEFAULT 'GB' NOT NULL
Les performances dépendent de la version d'Oracle que vous utilisez. Les verrous sont quand même générés.
Si la version <= Oracle 11.1, alors # 1 fait la même chose que # 2. C'est lent de toute façon. À partir d'Oracle 11.2, Oracle a introduit une excellente optimisation pour la première instruction (une commande qui fait tout). Vous n'avez pas besoin de modifier la commande - Oracle se comporte simplement différemment. Il stocke la valeur par défaut uniquement dans le dictionnaire de données au lieu de mettre à jour chaque ligne physique.
Mais je dois aussi dire que j'ai rencontré quelques bugs dans le passé liés à cette fonctionnalité (dans Oracle 11.2.0.1)
Je pense que ces problèmes sont résolus dans la version actuelle 11.2.0.3, je peux donc recommander d'utiliser cette fonctionnalité.
Il y a quelque temps, nous avons évalué les solutions possibles au même problème. Sur notre projet, nous avons dû supprimer tous les index sur la table, effectuer la modification et restaurer les index.
Si votre système doit utiliser la table, DBMS_Redefinition est vraiment votre seul choix.