Bonsoir,
Et voici donc le dernier petit post pour le mois de novembre. Et je ne vais pas faire original en vous parlant d'une petite nouveauté ORACLE 11.
Pour cela, on peut utiliser une petite table T3 (i number) de 40 millions de lignes (ca marche aussi avec moins ou plus de lignes).
Admettons que je veuille ajouter une colonne j de type number non nullable et avec une valeur par défaut 12.
Au niveau syntaxe, rien d'extrordinaire.
ALTER TABLE T3 ADD (j NUMBER DEFAULT 12 NOT NULL);
La syntaxe est la même avec ORACLE 10 et ORACLE 11. En revanche ce qui est différent, c'est le temps pour executer la commande.
ORACLE 10 : Au bout de 140 heures (et vu qu'ORACLE m'annoncait encore 150 heures) j'ai rennoncé à ajouter ma colonne.
ORACLE 11 : Instantanée.
En fait sous Oracle, l'ajout de la colonne avec une valeur par défaut entraine la mise à jour des 40 millions de lignes !! Alors qu'Oracle 11 utilise une métatable pour stocker la valeur par défaut. Seules les nouvelles valeurs seront insérées avec la valeur par défaut. En revanche, si je fais une requête sur des données portant avant l'ajout de la colonne, Oracle effectuera de manière transparante une jointure avec la metatable.
Ceci est notamment utile dans des environnements décisionnels. En effet, il est fréquent que les tables aient plusieurs millions de lignes. Par ailleurs, pour des problèmes de durée de sauvegarde, certaines données du passé sont placées sur des tablespaces en READ ONLY, ce qui evidemment est en opposition avec la possibilité d'effectuer une misa à jour.
Cela est valable aussi pour les colonnes "not null" avec des valeurs par défaut qu'avec des colonnes calculées (http://www.lao-dba.com/article-25070818.html)
LAO.