2009-02-10 5 views

Répondre

12

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

Si vous avez une FieldA clé Composit, 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 

Lorsque vous utilisez des parties de l'index, mais pas l'index complet, l'index sera utilisé de manière moins efficace via une analyse par saut d'index, une analyse d'index complet ou une analyse d'index complet rapide.

(Merci à David Aldridge pour la correction)

+1

Vous aimeriez peut-être corriger la partie d'utilisation de l'index - un balayage d'index, un index complet ou un index rapide complet sont des mécanismes qui permettent d'utiliser l'index dans tous ces cas. –

2

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

0

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

+0

L'index ne doit pas être du type unique pour prendre en charge une clé primaire. Dans certains cas (contraintes reportables ou PK sur une vue matérialisée), vous voudriez certainement un index non-unique en fait. –

4

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 autre (pas nécessairement unique) index existant comme celui-ci:

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

Pour B sélectionnez l'index sera utilisé si la colonne a ont une faible cardinalité seulement (par exemple un ont seulement 2 valeurs). En général, vous auriez pu deviner cette réponse si vous imaginiez que les colonnes ne sont pas indexées séparément, mais que la concaténation des colonnes est indexée (ce n'est pas tout à fait vrai, mais cela fonctionne en première approximation). Donc ce n'est pas un indice, b c'est plus comme un index || b.

2

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

Vous pouvez utiliser un chemin d'accès spécial appelé INDEX SKIP SCAN à utiliser cet index avec 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 
0

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

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

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

Oracle crée en fait un index sur l'une des plus à gauche groupements de colonnes. Donc ... Si vous voulez un index sur la colonne B, vous devrez en créer un pour la clé primaire.

P.S. Je sais que MySQL présente ce comportement le plus à gauche et je pense que SQL Server est également laissé la plupart

+0

Oracle créera seulement un index, sur (A, B, C). Vous pouvez créer les autres, mais Oracle a besoin d'un seul index pour appliquer une clé primaire. Il doit inclure toutes les colonnes du PK. – redcayuga

+0

Un index sur (A, B, C) peut facilement être utilisé par une requête qui n'a qu'un A dans sa clause WHERE. Oracle avait l'habitude d'exiger l'utilisation «la plus à gauche» d'un index, mais les versions plus récentes peuvent sauter le plus à gauche - comme d'autres l'ont noté. – redcayuga

0

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

Questions connexes