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>