Modifier la clé primaire
J'ai vu 2 approches pour modifier une clé primaire. l'approche 1, est une chose à laquelle j'ai supprimer la clé primaire (elle supprime l'index correspondant), puis de créer la clé primaire avec un nouvel indice en elle c'est à dire
alter table TABLE_NAME drop constraint PK_TABLE_NAME drop index;
alter table TABLE_NAME
add constraint PK_TABLE_NAME PRIMARY KEY ("COL1")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT)
TABLESPACE "USERS" ENABLE;
COMMIT;
/
La deuxième approche est de faire toutes les étapes indiviually c'est à dire
alter table TABLE_NAME drop constraint PK_TABLE_NAME;
drop index PK_TABLE_NAME;
CREATE UNIQUE INDEX PK_TABLE_NAME ON TABLE_NAME
(COL1)
LOGGING
TABLESPACE USERS
PCTFREE 10
INITRANS 2
MAXTRANS 255
STORAGE (
INITIAL 64K
MINEXTENTS 1
MAXEXTENTS UNLIMITED
PCTINCREASE 0
BUFFER_POOL DEFAULT
FLASH_CACHE DEFAULT
CELL_FLASH_CACHE DEFAULT
)
NOPARALLEL;
alter table TABLE_NAME add constraint PK_TABLE_NAME PRIMARY KEY ("COL1") USING INDEX PK_TABLE_NAME;
COMMIT;
/
Alors maintenant, mes questions sont les
- sont ces 2 approches a quelque chose de différent à l'arrière-plan, sauf pour le fait que les étapes sont séparées?
- Je vois que nous pouvons mentionner que le nom de la colonne wihtin des devis c'est à dire "COL1" ou sans les guillemets, c'est à dire COL1. Ces 2 approches ne fait aucune différence?
- Considérer ces étapes sont exécutées sur une table qui a des milliards DE DONNÉES, effectuez l'une de ces a aucun gain de performance sur les autres?
OriginalL'auteur x.509 | 2011-10-31
Vous devez vous connecter pour publier un commentaire.
Avec le DDL exactement comme vous l'avez, autant que je sache, il n'y a pas de différence entre les deux. (Ceci est basé sur la comparaison des
select dbms_metadata.get_ddl('TABLE', 'TABLE_NAME') from dual;
, certains simples tests de performance, et mon expérience précédente traitant de ces deux approches.)Mais si vous avez des milliards de lignes ou d'octets, alors vous devriez probablement utiliser le parallélisme, et puis il y a une différence significative. La première approche ne permet pas de créer l'index en parallèle (
ORA-03001: unimplemented feature
), mais la seconde méthode.Même si vous ne voulez pas de l'index en parallèle, vous devriez probablement créer en parallèle, et ensuite de le modifier pour noparallel.
Que pour les guillemets, ils ne font aucune différence lorsque la colonne est tout en majuscule. Mais si vous utilisez des majuscules et des minuscules, cela signifie que le nom est sensible à la casse et vous devez toujours utiliser les guillemets pour désigner le nom. C'est vraiment ennuyeux, donc j'ai l'habitude de supprimer les guillemets pour éviter accidentellement la création d'un nom qui respecte la casse.
Quelques autres notes. Vous pouvez envisager d'utiliser NOLOGGING. Et il n'est pas nécessaire pour le
COMMIT;
, DDL va automatiquement provoquer un commit.OriginalL'auteur Jon Heller