Es funktioniert wie erwartet. Oracle hat genau das getan, worum Sie es gebeten haben.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Sie haben einen zusammengesetzten Index für phonenumber, email
, während Sie keine der Spalten im Filterprädikat verwenden Ihrer Anfrage:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Es gibt also keinen Grund, warum Oracle einen Index-Scan durchführen sollte unter phonenumber, email
. Sie wählen einfach diese Spalten des zusammengesetzten Schlüssels aus und filtern sie nicht:
SELECT Phonenumber, email
from student left join Xyz
Index wird verwendet, wenn Sie PROJEKTIEREN diese Spalten, nicht nur SELECT . Der STUDENT
table gilt wie erwartet für einen FULL TABLE SCAN
da es sich um eine einfache Auswahl handelt und keine Filter für die indizierten Spalten verwendet werden. Wenn Sie sehen möchten, dass ein Index-Scan stattfindet, fügen Sie den folgenden Filter hinzu:
AND phonenumber = <value>
AND email = <value>