Działa zgodnie z oczekiwaniami. Firma Oracle zrobiła dokładnie to, o co jej prosiłeś.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Masz złożony indeks na phonenumber, email
, ale nie używasz żadnej z kolumn w predykacie filtra Twojego zapytania:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Więc nie ma powodu, dla którego Oracle miałby skanować indeks na phonenumber, email
. Po prostu wybierasz te kolumny klucza złożonego, nie filtrujesz ich:
SELECT Phonenumber, email
from student left join Xyz
Indeks będzie używany, gdy PROJEKTUJ te kolumny, a nie tylko SELECT . STUDENT
tabela zgodnie z oczekiwaniami przechodzi do FULL TABLE SCAN
ponieważ jest to zwykły wybór i nie używa żadnego filtra w indeksowanych kolumnach. Jeśli chcesz zobaczyć, jak przebiega skanowanie indeksu, dodaj poniższy filtr:
AND phonenumber = <value>
AND email = <value>