Funciona como esperado. A Oracle fez exatamente o que você pediu.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Você tem um índice composto em
phonenumber, email
, embora você não use nenhuma das colunas no predicado de filtro da sua consulta:where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Portanto, não há razão para que a Oracle faça uma verificação de índice em
phonenumber, email
. Você está simplesmente SELECIONANDO essas colunas de chave composta, não as filtrando:SELECT Phonenumber, email
from student left join Xyz
Índice será usado quando você PROJETAR essas colunas, não apenas SELECT . O
STUDENT
tabela como esperado vai para um FULL TABLE SCAN
pois é uma seleção simples e não usa nenhum filtro nas colunas indexadas. Se você quiser ver uma verificação de índice acontecendo, adicione o filtro abaixo:AND phonenumber = <value>
AND email = <value>