Работи според очакванията. Oracle направи точно това, което поискахте от него.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Имате съставен индекс на phonenumber, email
, докато не използвате нито една от колоните в предиката за филтър на вашата заявка:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Така че няма причина Oracle да направи сканиране на индекс на phonenumber, email
. Вие просто избирате тези колони от съставен ключ, а не ги филтрирате:
SELECT Phonenumber, email
from student left join Xyz
Индекс ще се използва, когато ПРОЕКТИРАТЕ тези колони, а не само SELECT . STUDENT
таблицата, както се очаква, отива за FULL TABLE SCAN
тъй като е обикновен избор и не използва никакъв филтър върху индексираните колони. Ако искате да видите сканиране на индекс, добавете филтър по-долу:
AND phonenumber = <value>
AND email = <value>