Det fungerer som forventet. Oracle gjorde præcis, hvad du bad det om.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Du har et sammensat indeks på phonenumber, email
, mens du ikke bruger nogen af kolonnerne i filterprædikatet af din forespørgsel:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Så der er ingen grund til, at Oracle ville lave en indeksscanning på phonenumber, email
. Du vælger simpelthen disse kolonner med sammensat nøgle, ikke filtrerer dem:
SELECT Phonenumber, email
from student left join Xyz
Indeks vil blive brugt, når du PROJEKTERER disse kolonner, ikke kun SELECT . STUDENT
tabel som forventet går til en FULL TABLE SCAN
da det er et almindeligt valg og ikke bruger noget filter på de indekserede kolonner. Hvis du vil se en indeksscanning, skal du tilføje filteret nedenfor:
AND phonenumber = <value>
AND email = <value>