Cela fonctionne comme prévu. Oracle a fait exactement ce que vous lui avez demandé de faire.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Vous avez un index composite sur phonenumber, email
, alors que vous n'utilisez aucune des colonnes du prédicat de filtre de votre requête :
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Il n'y a donc aucune raison pour qu'Oracle fasse une analyse d'index sur phonenumber, email
. Vous sélectionnez simplement ces colonnes de clé composite, sans les filtrer :
SELECT Phonenumber, email
from student left join Xyz
Index sera utilisé lorsque vous PROJETEZ ces colonnes, pas seulement SELECT . L'STUDENT
table comme prévu va pour un FULL TABLE SCAN
car il s'agit d'une simple sélection et n'utilise aucun filtre sur les colonnes indexées. Si vous souhaitez voir une analyse d'index se produire, ajoutez le filtre ci-dessous :
AND phonenumber = <value>
AND email = <value>