web-dev-qa-db-fra.com

Meilleure façon d'ajouter une colonne avec la valeur par défaut pendant le chargement

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
22
Ben George

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)

  • échec de l'importation traditionnelle si l'exportation a été effectuée avec direct = Y
  • l'instruction de fusion peut lancer un ORA-600 [13013] (erreur Oracle interne)
  • un problème de performances dans les requêtes utilisant de telles tables

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é.

18
Roman Krüger

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.

0
Dewfy

Si votre système doit utiliser la table, DBMS_Redefinition est vraiment votre seul choix.

0
David Aldridge