Question

Si je mets une clé primaire dans plusieurs colonnes Oracle, ai-je besoin aussi de créer les indices si je besoin?

Je crois que lorsque vous définissez une clé primaire sur un colonne, vous avez indexé par celui-ci; est-ce la même chose avec plusieurs colonnes PKs?

Merci

Était-ce utile?

La solution

Non, les index ne seront pas créés pour les différents champs.

Si vous avez une clé Composit FieldA, FieldB, FieldC et vous

select * from MyTable where FieldA = :a 

ou

select * from MyTable where FieldA = :a and FieldB = :b

Ensuite, il utilisera cet index (car ils sont les deux premiers champs dans la clé)

Si vous avez

select * from MyTable where FieldB = :b and FieldC = :c

Si vous utilisez des parties de l'indice, mais pas l'index complet, l'indice sera utilisé de manière moins efficace grâce à un saut d'index de balayage, balayage complet d'index ou une analyse complète des index rapide.

(Merci à David Aldridge pour la correction)

Autres conseils

Si vous créez une clé primaire sur les colonnes (A, B, C), puis Oracle par défaut créer un index unique sur (A, B, C). Vous pouvez dire Oracle d'utiliser un index existant différent (pas nécessairement unique) comme ceci:

alter table mytable add constraint mytable_pk 
primary key (a, b, c)
using index mytable_index;

Vous obtiendrez un index sur plusieurs colonnes, ce qui est la même que celle ayant un indice sur chaque colonne.

La clé primaire implique la création d'une composite unique index sur des colonnes de clé primaire.

Vous pouvez utiliser un chemin d'accès spécial appelé INDEX SKIP SCAN à utiliser cet indice prédicats qui ne comprennent pas la première colonne indexée:

SQL> CREATE TABLE t_multiple (mul_first INTEGER NOT NULL, mul_second INTEGER NOT NULL, mul_data VARCHAR2(200))
  2  /
Table created

SQL> ALTER TABLE t_multiple ADD CONSTRAINT pk_mul_first_second PRIMARY KEY (mul_first, mul_second)
  2  /
Table altered

SELECT  /*+ INDEX_SS (m pk_mul_first_second) */
    *
FROM    t_multiple m
WHERE   mul_second = :test 

SELECT STATEMENT, GOAL = ALL_ROWS                            
 TABLE ACCESS BY INDEX ROWID       SCOTT    T_MULTIPLE
  INDEX SKIP SCAN                  SCOTT    PK_MUL_FIRST_SECOND

Une clé primaire est un seul index (unique), contenant éventuellement plusieurs colonnes

B index de sélection sera utilisé si une colonne ont une faible cardinalité seulement (par exemple un avoir que deux valeurs). En général, vous auriez pu deviner cette réponse si vous imaginiez que les colonnes non indexées séparément, mais concaténation des colonnes indexées (il est pas tout à fait vrai, mais il fonctionne pour la première approximation). Donc, ce n'est pas un, l'indice de b il est plus comme un indice || b.

Vous devrez peut-être définir des index individuels sur les colonnes en fonction de votre structure de clé primaire.

clés primaires composites et index crée un index de la manière suivante. Dire que j'ai colonnes A, B, C et i a créer la clé primaire de (A, B, C). Cela se traduira par des indices

  • (A, B, C)
  • (A, B)
  • (A)

Oracle crée en fait un indice sur l'un des groupements les plus colonne de gauche. Alors ... Si vous voulez un index sur la colonne B, vous devez en créer un pour elle ainsi que la clé primaire.

P.S. Je sais exibits MySQL ce qui a laissé le plus le comportement et je pense que SQL Server est également laissé la plupart

Dans Oracle, ce n'est pas une déclaration exacte. Il crée seulement 1 index (A, B, C). Ne crée pas (A, B) et des indices (A).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top