2009-02-10 6 views

risposta

12

No, non saranno creati gli indici per i singoli campi.

Se si dispone di un composit chiave FieldA, FieldB, FieldC e si

select * from MyTable where FieldA = :a 

o

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

Poi sarà utilizzare questo indice (perché loro sono i primi due campi nella chiave)

Se hai

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

Se si utilizzano parti dell'indice, ma non l'indice completo, l'indice verrà utilizzato in modo meno efficiente tramite una scansione di salto indice, una scansione dell'indice completa o una scansione dell'indice completa rapida.

(Grazie a David Aldridge per la correzione)

+1

È possibile correggere la parte di utilizzo dell'indice: una scansione di salto indice, una scansione dell'indice completa o una scansione dell'indice completa rapida sono meccanismi che consentono di utilizzare l'indice per tutti questi casi. –

2

Otterrete un indice su più colonne, che non è lo stesso che avere un indice su ogni colonna.

0

Una chiave primaria è solo un (unico) indice, che può contenere più colonne

+0

L'indice non deve essere del tipo univoco per supportare una chiave primaria. In alcuni casi (vincoli deferibili o un PK su una vista materializzata) vorresti sicuramente un indice non univoco di fatto. –

4

Se si crea una chiave primaria su colonne (A, B, C) poi Oracle di default di creare un indice univoco (A, B. C). Si può dire Oracle per utilizzare una diversa (non necessariamente unico) indice esistente in questo modo: sarà utilizzato

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

Per selezionare B indice se la colonna A ha solo bassa cardinalità (ad esempio un avere solo 2 valori). In generale avresti potuto indovinare questa risposta se immaginavi che le colonne non sono indicizzate separatamente, ma la concatenazione indicizzata delle colonne (non è completamente vero, ma funziona per prima approssimazione). Quindi non è un indice b, è più come un indice || b.

2

La chiave primaria implica la creazione di composite unique index sulle colonne chiave primarie.

È possibile utilizzare un percorso di accesso speciale chiamato INDEX SKIP SCAN utilizzare questo indice con predicati che non includono la prima colonna indicizzata:

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

potrebbe essere necessario impostare singoli indici sulle colonne a seconda della chiave primaria struttura.

Le chiavi primarie composte e gli indici creeranno gli indici nel modo seguente. Supponiamo di avere le colonne A, B, C e i a creare la chiave primaria su (A, B, C).Questo si tradurrà in indici

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

Oracle crea in realtà un indice su uno dei più sinistra raggruppamenti di colonne. Quindi ... Se vuoi un indice solo sulla colonna B dovrai crearne uno per esso e la chiave primaria.

P.S. So che MySQL mostra questo comportamento più a sinistra e penso che anche SQL Server sia rimasto più

+0

Oracle creerà solo un indice, su (A, B, C). È possibile creare gli altri ma Oracle ha bisogno e richiede un solo indice per imporre una chiave primaria. Deve includere tutte le colonne del PK. – redcayuga

+0

Un indice su (A, B, C) può essere facilmente utilizzato da una query che ha solo A nella sua clausola WHERE. Oracle aveva l'abitudine di richiedere l'uso "a sinistra" di un indice, ma le versioni più recenti possono saltare a sinistra - come altri hanno notato. – redcayuga

0

In Oracle, questa non è una dichiarazione accurata. Crea solo 1 indice su (A, B, C). Non crea indici (A, B) e (A).