2010-06-29 3 views
0

J'ai un référentiel Oracle opérationnel et a dit 10 millions d'enregistrements. L'un de la table est de direMise à niveau du schéma Oracle avec une nouvelle contrainte: comment puis-je réduire les temps de mise à niveau?

CREATE TABLE TABLE_A 
NAME VARCHAR2(128), 
VER VARCHAR2(128), 
TYPE VARCHAR2(32), 
DESCRIPTION VARCHAR2(256), 
CONSTRAINT TABLE_A_PK PRIMARY KEY ("NAME","VERSION"); 

Ce tableau est utilisé pour longtemps et dire maintenant, j'ai une obligation de changer la contrainte de clé primaire. Maintenant, j'ai l'obligation d'avoir une autre colonne dire ID et clé primaire pour être la combinaison de NAME, VER, TYPE et LANG.

Dans le script de mise à niveau que je peux avoir quelque chose comme

EXECUTE IMMEDIATE 
ALTER TABLE TABLE_A ADD LANG VARCHAR2(32); 
EXECUTE IMMEDIATE 
UPDATE TABLE TABLE_A SET LANG ='|| 'en_US'; 
EXECUTE IMMEDIATE 
UPDATE TABLE TABLE_A SET TYPE='||'n/a'||' WHERE TYPE IS NULL; 

Avant TYPE peut avoir des valeurs et parfois nulle. Puisque après la mise à niveau sa partie de clé primaire, elle ne peut pas être nulle, ce qui la rend n/a si elle est nulle.

Mais faire plus de chose pour 10 millions d'enregistrements nécessite un temps d'arrêt de mise à niveau de 5 heures au moins. Y a-t-il un autre moyen de rendre une colonne précédente comme clé primaire et de ne pas exiger beaucoup de temps d'arrêt? Veuillez également me suggérer si je me trompe dans mon approche. Merci à l'avance

Répondre

0

Tout d'abord, je ne comprends pas pourquoi utiliser EXECUTE IMMEDIATE. Ensuite, qu'en est-il de créer un PK en utilisant les contraintes Novalidated activées, il s'appliquera aux nouvelles lignes insérées mais pas aux anciennes. Comme cela, vous pouvez exécuter batch pour modifier les données existantes pour valider le nouveau PK. En savoir plus: http://download.oracle.com/docs/cd/B19306_01/server.102/b14211/data_acc.htm#i6516

Pour la colonne LANG, vous pouvez également donner une valeur par défaut:

ALTER TABLE TABLE_A ADD LANG VARCHAR2(32) default 'en_US'; 

puis

ALTER TABLE TABLE_A MODIFY LANG VARCHAR2(32) default null; 

Nicolas.

0

La clé primaire actuelle aurait un index de prise en charge qui est probablement un index unique sur NAME/VERSION.

Une fois les colonnes ajoutées, vous pouvez créer un index unique sur ces quatre colonnes. Puis remplacez la contrainte de clé primaire, supprimez l'ancien index (s'il ne le fait pas automatiquement lorsque vous supprimez la contrainte PK) et utilisez l'index nouvellement créé.

Cela ne réduira pas le temps total, mais cela pourrait vous permettre de diviser l'ensemble de l'opération en 5 étapes d'une heure, par exemple, plutôt qu'en une seule étape de 5 heures.

Questions connexes