Het werkt zoals verwacht. Oracle deed precies wat je ervan vroeg.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Je hebt een samengestelde index op phonenumber, email
, terwijl u geen van de kolommen in het filterpredikaat . gebruikt van uw vraag:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Er is dus geen reden waarom Oracle een indexscan zou doen op phonenumber, email
. Je SELECTEERt gewoon die kolommen van de samengestelde sleutel, niet om ze te filteren:
SELECT Phonenumber, email
from student left join Xyz
Index wordt gebruikt wanneer u PROJECT die kolommen, niet alleen SELECT . De STUDENT
tabel zoals verwacht geldt voor een FULL TABLE SCAN
omdat het een gewone selectie is en geen filter gebruikt op de geïndexeerde kolommen. Als u een indexscan wilt zien, voeg dan onderstaande filter toe:
AND phonenumber = <value>
AND email = <value>