Ia bekerja seperti yang diharapkan. Oracle melakukan persis seperti yang Anda minta.
CREATE INDEX email_phonenumber_student_idx
ON student(phonenumber, email);
Anda memiliki indeks gabungan di phonenumber, email
, sementara Anda tidak menggunakan kolom apa pun di predikat filter dari kueri Anda:
where months_between(SYSDATE, dateofbirth)/12 >= 18
and xyz.studentnumber is null;
Jadi tidak ada alasan mengapa Oracle melakukan pemindaian indeks di phonenumber, email
. Anda cukup MEMILIH kolom kunci komposit tersebut, bukan memfilternya:
SELECT Phonenumber, email
from student left join Xyz
Indeks akan digunakan saat Anda PROYEK kolom tersebut, bukan hanya PILIH . STUDENT
tabel seperti yang diharapkan berlaku untuk FULL TABLE SCAN
karena ini adalah pilihan biasa dan tidak menggunakan filter apa pun pada kolom yang diindeks. Jika Anda ingin melihat pemindaian indeks terjadi, tambahkan filter di bawah ini:
AND phonenumber = <value>
AND email = <value>