Funciona como se esperaba. Oracle hizo exactamente lo que le pidió que hiciera.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Tiene un índice compuesto en phonenumber, email
, mientras no use ninguna de las columnas en el predicado de filtro de su consulta:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Entonces, no hay razón por la cual Oracle haría un escaneo de índice en phonenumber, email
. Simplemente está SELECCIONANDO esas columnas de clave compuesta, no filtrándolas:
SELECT Phonenumber, email
from student left join Xyz
Índice se usará cuando PROJECT esas columnas, no solo SELECT . El STUDENT
la tabla como se esperaba va para un FULL TABLE SCAN
ya que es una selección simple y no usa ningún filtro en las columnas indexadas. Si desea ver que se realiza un escaneo de índice, agregue el siguiente filtro:
AND phonenumber = <value>
AND email = <value>