2013-10-25 10 views
6

ho tavoloOracle: indice a più colonne singolo o due indici di colonna singoli

create table1(
    column1 number(10, 
    column2 number(10), 
    column3 number(10) 
); 

column1 è chiave primaria column2 e column3 è la chiave vincolo univoco

ho creato degli Esteri su 2 colonne

alter table table1 
     add constraint table1_contr1 unique(column1,column2) 
     using index tablespace tbs1; 

quando sono andato a creare l'indice su entrambe le colonne come

create index table1_idx1 on table1(column1,coulmn2); 

ERROR at line 1: 
ORA-01408: such column list already indexed 

Quindi Oracle ha già creato l'indice quando creo un vincolo univoco. Ma se creo indice separatamente si tratta di accettare quelle

create index table1_idx1 on table1(column1); 
create index table2_idx2 on table2(column2); 

Ora la mia domanda è, dopo aver vincolo univoco su entrambe le colonne faccio ancora bisogno di preoccuparsi di creare un indice su ogni colonna? Senza indice su ogni colonna avrà un impatto sulle prestazioni durante l'accesso all'oggetto?

È su Oracle 11R2.

+1

Quando dici 'column2' e' column3' sono una chiave esterna, vuoi dire che la combinazione di 'column2, column3' è una chiave esterna per una singola tabella genitore con una chiave primaria composta? O che ognuna di 'column2' e' column3' sono chiavi esterne per separare le tabelle genitore con le chiavi primarie a colonna singola? Se 'column1' è già la chiave primaria, perché stai creando un vincolo univoco sulla combinazione di' column1' e 'column2'. 'column1' è già unico quindi la combinazione di esso e di qualsiasi altra cosa sarà unica. Intendevi che stai creando un vincolo univoco su 'col2, col3'? –

+0

Mi dispiace, errore di battitura. Sto creando un vincolo univoco su (col2, col3). – user2824874

risposta

9

Dipende ...

E 'del tutto improbabile che un indice su un solo column1 sarà utile se si dispone già di un indice composito sulla column1, column2. Poiché column1 è l'indice principale, le query sulla tabella che hanno solo column1 come predicato saranno in grado di utilizzare l'indice composito. Se frequenti le query che devono eseguire una scansione completa dell'indice e la presenza di column2 aumenta notevolmente la dimensione dell'indice, è possibile che un indice su solo column1 sia più efficiente poiché la scansione dell'indice completa dovrebbe fare meno I/O. Ma questa è una situazione piuttosto insolita.

Un indice su solo column2 può essere utile se alcune delle query sulla tabella specificano predicati solo su column2. Se vi sono relativamente pochi valori distinti di column1, è possibile che Oracle esegua una scansione di salto indice utilizzando l'indice composito per soddisfare le query che specificano solo come riferimento column2. Ma una scansione di salto è probabilmente molto meno efficiente di una scansione di intervallo, quindi è ragionevolmente probabile che un indice su solo column2 possa essere di beneficio a quelle query. Se esiste un numero elevato di valori distinti per column1, la scansione di salto sarebbe ancora meno efficiente e un indice solo su column2 sarebbe più vantaggioso. Ovviamente, se non si interroga mai la tabella utilizzando column2 senza specificare un predicato su column1, non è necessario un indice solo su column2.

0

Gli indici sono strutture che migliorano le prestazioni sul recupero delle informazioni, ovvero ogni volta che si utilizza una clausola SELECT, poiché cercherà la chiave dell'indice e restituirà il valore oi valori collegati a tale chiave. Tuttavia, gli indici aumentano il costo dell'aggiornamento e inseriscono le operazioni in quanto è necessario aggiornare la struttura per mantenerla efficiente per il recupero delle informazioni.

La creazione di indici per colonne singole non migliorerà le prestazioni di lettura, tuttavia diminuirà le prestazioni di scrittura e aggiornamento AFAIK.

Problemi correlati