Oracle
 sql >> Database >  >> RDS >> Oracle

Posso avere un indice composito attivo quando utilizzo un join sinistro

Funziona come previsto. Oracle ha fatto esattamente quello che gli hai chiesto di fare.

CREATE INDEX email_phonenumber_student_idx
  ON student(phonenumber, email);

Hai un indice composito su phonenumber, email , mentre non utilizzi nessuna delle colonne nel predicato del filtro della tua richiesta:

where months_between(SYSDATE, dateofbirth)/12 >= 18 
and  xyz.studentnumber is null;

Quindi non c'è motivo per cui Oracle esegua una scansione dell'indice su phonenumber, email . Stai semplicemente SELEZIONANDO quelle colonne di chiave composta, non filtrandole:

SELECT Phonenumber, email 
from student left join Xyz

Indice verrà utilizzato quando PROGETTO quelle colonne, non solo SELECT . Il STUDENT la tabella come previsto va per una FULL TABLE SCAN poiché è una semplice selezione e non utilizza alcun filtro sulle colonne indicizzate. Se vuoi vedere una scansione dell'indice in corso, aggiungi il filtro di seguito:

AND phonenumber = <value>
AND email = <value>